簡體   English   中英

將對象嵌套數組合並為一個新數組

[英]Merge object nested arrays into a single new array

給定下面的對象,我正在尋找一種干凈有效的方法來從每個項目的“ 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);
  }
});

注意:如圖所示,所有子項目數組只能使用相同的鍵向下一層,並且可能存在也可能不存在。

您可以將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) 

首先,您只想獲得以下子項:

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), []);

您可以通過對項目數組應用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']||[]),[]);

您可以使用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); 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM