2

If there is a Javascript object with multiple levels, as in:

 myObject = { a: 12, obj11: { obj111: 'John', b:13, obj1111: { a:15, b: 35 } obj21: { a:15, b:16 } } 

I want to write a function to which is passed the object, an array of keys and the value to be assigned to the matched property.

 function myFunc (myObj,myArr, newValue) { ... } myFunc(myObject, ['obj11', 'obj1111'], {z:12}); console.log(myObject.obj11.obj1111); 

Should display {z:12}. Assume that the keys in the array are always correct.

1
  • You can loop over myArr. Commented Oct 28, 2017 at 21:30

2 Answers 2

3

You can use reduce() method to find nested object and if its found then you can use Object.assign() to add new property.

var myObject = {"a":12,"obj11":{"obj111":"John","b":13,"obj1111":{"a":15,"b":35},"obj21":{"a":15,"b":16}}} function myFunc (myObj, myArr, newValue) { myArr.reduce(function(r, e, i, arr) { if(!arr[i+1] && typeof r[e] == 'object') Object.assign(r[e], newValue); return r[e] || {} }, myObj) } myFunc(myObject, ['obj11', 'obj1111'], {z:12}); console.log(myObject)

Update If you just want to change value of nested property then you can use something like this.

var myObject = {"a":12,"obj11":{"obj111":"John","b":13,"obj1111":{"a":15,"b":35},"obj21":{"a":15,"b":16}}} function myFunc (myObj, myArr, newValue) { myArr.reduce(function(r, e, i, arr) { if(!arr[i+1] && r[e]) r[e] = newValue return r[e] || {} }, myObj) } myFunc(myObject, ['obj11', 'obj1111'], {z:12}); console.log(myObject)

Sign up to request clarification or add additional context in comments.

1 Comment

I got the hang of it. But it will not work if I pass a scalar new value, as in myFunc(myObject, ['obj11', 'obj1111'], 25); which should assign 25 to obj11.obj1111
1
function myFunc(myObj,myArr,newValue){ var temp=myObj; for(var I=0;I<myArr.length;I++){ temp=temp[myArr[I]]; } temp=newValue; }; 

Update: This is a classic example of how you can access properties from an object in JavaScript. You may, for simplicity, consider object as an array of properties. Now try and access the required property as if it is the index of the array. If u have a nested object, consider it as a nested array.

Eg: console.log(myObj['obj11']['obj1111']);

The above code will display { a:15, b: 35 }, before running the myFunc() and will display {z:12} after running it.

1 Comment

Please add text to this answer to explain it a little

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.