简体   繁体   中英

creating an multidimensional Object dynamically from an multidimensional array

Im trying to create an multidimensional Object like this one:

{ A : {a1: {},a2:{}}, B: {b1:{},b2:{}}}

from an multidimensional array like this one:

let array1 = [
      ['A', 'a1'],
      ['A', 'a1'],
      ['A', 'a2'],
      ['B', 'b1'],
      ['B', 'b1'],
      ['B', 'b2'],
    ];

I'm trying this for some hours now and was also reading plenty of entrys here on stackoverflow, but nothing really fits this specific case.

What i did so far:

 let array1 = [ ['A', 'a1'], ['A', 'a1'], ['A', 'a2'], ['B', 'b1'], ['B', 'b1'], ['B', 'b2'], ]; let object1 = {}; array1.forEach(function (subArray) { let level1 = subArray[0]; let level2 = subArray[1]; object1[[level1]] = {...{ [level2]: {} } }; }); console.log('object: ', object1); //desired output: object = { A: {a1: {},a2:{}}, B: {b1:{},b2:{}}} //what I get: object = { A: {a2:{}}, B: {b2:{}}}

So somehow in my code the entrys like {a1: {}} are getting overwritten in each iteration instead of adding a new entry.

Thanks a lot in advance.

You can use Array.reduce() along with some destructuring to get the required object output.

For each key, value pair in the original array, we add a property to the final object, (eg 'A'), then add a new object for each value in the array (eg 'a1', 'a2').

 let array1 = [ ['A', 'a1'], ['A', 'a1'], ['A', 'a2'], ['B', 'b1'], ['B', 'b1'], ['B', 'b2'], ]; let output = array1.reduce((acc, [k,v]) => { acc[k] = {...(acc[k] || {}), [v]: {} }; return acc; }, {}) console.log(output)
 .as-console-wrapper { max-height: 100%;important: top; 0; }

One could also do this in a one-liner, but I think it's a lot harder to read (and understand):

 let array1 = [ ['A', 'a1'], ['A', 'a1'], ['A', 'a2'], ['B', 'b1'], ['B', 'b1'], ['B', 'b2'], ]; let output = array1.reduce((acc, [k,v]) => ({...acc, [k]: {...(acc[k] || {}), [v]: {} } }), {}); console.log(output)
 .as-console-wrapper { max-height: 100%;important: top; 0; }

Keep previous properties using ...object1[[level1]] :

 let array1 = [ ['A', 'a1'], ['A', 'a1'], ['A', 'a2'], ['B', 'b1'], ['B', 'b1'], ['B', 'b2'], ]; let object1 = {}; array1.forEach(function (subArray) { let level1 = subArray[0]; let level2 = subArray[1]; object1[[level1]] = {...object1[[level1]], // Keep previous properties...{ [level2]: {} } // Add new }; }); console.log('object: ', object1);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM