鉴于下面的对象,我正在寻找一种干净有效的方法来从每个项目的“ subItems”数组创建数组。
const items = [{
'a': 'a1',
'b': 'b1',
'subItems': [
{'c': 'c1'},
{'d': 'd1'}
]
},
{
'e': 'e1',
'subItems': [
{'f': 'f1'},
{'g': 'g1'}
]
}
];
因此对于此示例,我需要的结果是:
const groupedSubItems = [{c: c1},{d:d1},{f:f1},{g:g1}];
目前,我只是循环遍历和封装所有数组,但是这似乎并不是处理此问题的最佳方法:
let groupedSubItems = [];
items.forEach(function(item) {
if (item.subItems) {
groupedSubItems = groupedSubItems.concat(item.subItems);
}
});
注意:所有子项目数组只能使用相同的键向下显示一级,并且可能相同,也可能不存在。
答案 0 :(得分:1)
您可以将concat
与扩展语法和map
方法一起使用来创建子项目数组。
const items = [{"a":"a1","b":"b1","subItems":[{"c":"c1"},{"d":"d1"}]},{"e":"e1","subItems":[{"f":"f1"},{"g":"g1"}]}]
const subItems = [].concat(...items.map(({subItems}) => subItems || []));
console.log(subItems)
答案 1 :(得分:0)
首先,您只想获取子项:
var itemsSubItems = items.map(function(item) { return item.subItems; });
// [ [ { item: 1 }, { item: 2 } ], [ { item: 3 } ] ]
这为您提供了一个数组数组。数组中的每个元素仍然代表一个项目:该项目的子项目。现在,您只需要子项目数组,而不是由项目定界。
var subItems = itemsSubItems.reduce(function(si, current) {
return si.concat(current);
}, []);
对于外部数组中的每个子项数组,将它们连接到一个新数组。
一个简短的ES6示例:
const subItems = items.map(item => item.subItems).reduce((a, c) => a.concat(c), []);
答案 2 :(得分:0)
您可以通过在商品列表上应用reduce来轻松实现这一目标。
const items = [{"a":"a1","b":"b1","subItems":[{"c":"c1"},{"d":"d1"}]},{"e":"e1","subItems":[{"f":"f1"},{"g":"g1"}]}];
const subItems = items.reduce((acc, actual) => acc.concat(actual['subItems']||[]),[]);
答案 3 :(得分:0)
您可以使用forEach
和扩展运算符...
来获得所需的结果
const items = [{'a': 'a1','b': 'b1','subItems': [{'c': 'c1'},{'d': 'd1'}]},{'e': 'e1','subItems': [{'f': 'f1'},{'g': 'g1'}]}];
const subItems = [];
items.forEach(obj => subItems.push(...obj.subItems));
console.log(subItems);