从多维数组动态创建多维对象
creating an multidimensional Object dynamically from an multidimensional array
我正在尝试创建一个像这样的多维对象:
{ A : {a1: {},a2:{}}, B: {b1:{},b2:{}}}
来自像这样的多维数组:
let array1 = [
['A', 'a1'],
['A', 'a1'],
['A', 'a2'],
['B', 'b1'],
['B', 'b1'],
['B', 'b2'],
];
我现在已经尝试了几个小时,并且还在 Whosebug 上阅读了大量条目,但没有任何内容真正适合这种特定情况。
到目前为止我做了什么:
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:{}}}
所以在我的代码中,以某种方式,像 {a1: {}} 这样的条目在每次迭代中都会被覆盖,而不是添加新条目。
非常感谢。
您可以使用Array.reduce() along with some destructuring来获取所需的对象输出。
对于原始数组中的每个键值对,我们向最终对象添加一个属性,(例如'A'),然后为数组中的每个值添加一个新对象(例如 '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; }
也可以单行执行此操作,但我认为它更难阅读(和理解):
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; }
使用 ...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);
我正在尝试创建一个像这样的多维对象:
{ A : {a1: {},a2:{}}, B: {b1:{},b2:{}}}
来自像这样的多维数组:
let array1 = [
['A', 'a1'],
['A', 'a1'],
['A', 'a2'],
['B', 'b1'],
['B', 'b1'],
['B', 'b2'],
];
我现在已经尝试了几个小时,并且还在 Whosebug 上阅读了大量条目,但没有任何内容真正适合这种特定情况。
到目前为止我做了什么:
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:{}}}
所以在我的代码中,以某种方式,像 {a1: {}} 这样的条目在每次迭代中都会被覆盖,而不是添加新条目。
非常感谢。
您可以使用Array.reduce() along with some destructuring来获取所需的对象输出。
对于原始数组中的每个键值对,我们向最终对象添加一个属性,(例如'A'),然后为数组中的每个值添加一个新对象(例如 '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; }
也可以单行执行此操作,但我认为它更难阅读(和理解):
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; }
使用 ...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);