将对象嵌套数组合并为一个新数组

时间:2018-11-20 13:51:29

标签: javascript arrays

鉴于下面的对象,我正在寻找一种干净有效的方法来从每个项目的“ 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);
  }
});

注意:所有子项目数组只能使用相同的键向下显示一级,并且可能相同,也可能不存在。

4 个答案:

答案 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);