How Recursion Takes Place In This Code Snippet?
Solution 1:
Object.prototype.toString.call(obj[e]) === "[object Object]" is never true. It is always "[object Undefined]"
At the beginning:
obj:: {} prop:: 'foo.bar.foobar'Before first call from inner function (
if):obj:: {foo: {}} prop:: ['bar', 'foobar']Before second call from inner function (
if):obj:: {foo: {bar: {}}} prop:: ['foobar']At last execution, as
prop.lengthis 1 (else- no more recursion):obj:: {foo: {bar: {foobar: 'Value'}}} prop:: []
Objects in Javascript are always passed as Reference, refer to @Tiny Giant's comment.
Solution 2:
Object.prototype.toString.call(obj[e]) === "[object Object]" is just a really ugly way of saying "(if) this object actually exists...". I won't explain in detail how it works, because it's not a good example and you may not understand it.
What the code wants is to be able to add/edit an object property. For example:
var person = {name: 'Liana', hair: {color:'red', style:'long'}};
assing(person, 'name', 'George');
...etc. But what if you wanted to edit a nested attribute, like the hair color?
assign(person, 'hair.color', 'brown');
Basically, the assign function is called twice:
assign(person, 'hair.color', ...)- This detects we are editing a nested attribute (
color) insidehair, and it makes surehairactually exists insideperson. - If not, it creates
person.hair(That's what the ugly line is about) - Then calls
assing(person.hair, 'color', 'brown');
I would personally write the function like this:
function assign(object, prop, value) {
prop = prop.split('.');
if(prop.length > 1) {
var first = prop.shift();
prop = prop.join('.');
if(typeofobject[first] != 'object')
object[first] = {};
assign(object[first], prop, value);
} else {
object[prop] = value;
}
}
Solution 3:
How recursion is happening, as the function is not returning anything ?
Returning a value is not necessary for recursion to happen. Here, the condition prop.length > 1 will stop the recursion after setting value to the desired property
How the value of the arguments in the inner call being changed as the function in the top most call stack(of assign function) is completed ?
I am not sure what you are asking about here. I think you are asking about this line
assign(obj[e] =
Object.prototype.toString.call(obj[e]) === "[object Object]"
? obj[e]
: {},
prop,
value);
This code checks whether obj is object or not. If obj is not an object, then it will be changed to an object in the recursion call itself.
Post a Comment for "How Recursion Takes Place In This Code Snippet?"