I'm trying to use the apply method to invoke the objectify function, passing an array of values and using obj as the object. However, this is not being set to the object, but rather the global environment (window).
The purpose of this is to get an array of strings, then pass those strings to the function objectify. When the function is invoked, it takes the array values, splits them, and, if the object does not have a property with the string value, that property is created.
Here is the code below:
let obj = {};
let arr = ["user.name.firstname=John", "user.name.lastname=Smith"];
const objectify = x => {
let cur = this, v;
return x.split('.').forEach(e => /=/g.test(e) ?
(v = e.split('='), cur[v[0]] = v[1]) : cur[e] ?
cur = cur[e] : (cur[e] = {}, cur = cur[e]))};
objectify.apply(obj,arr);
The problem is this is set as Window rather than the object obj. How should I rewrite this code so that it sets obj as the this value?
The end result should be a modified obj object so it becomes:
obj = {user: {name: {firstname: 'John', lastname: 'Smith'}}};
This (no pun intended) is happening because objectify is an "arrow function" that always uses the this that it inherits from the lexical scope, and will ignore any passed via .apply or .call.
If you rewrite it as a normal function it should work as desired.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With