es6遍历带有嵌套数组的对象数组并返回单个数组?

时间:2019-04-11 03:55:05

标签: javascript ecmascript-6

鉴于以下情况,如何返回单个数组?

let array = [{
    name: "name01", 
    arr: [
      {name: "inner01"}, 
      {name: "inner02"}, 
      {name: "inner03"}
    ]
  }, {
    name: "name02", 
    arr: [
      {name: "inner04"}, 
      {name: "inner05"}, 
      {name: "inner06"}
    ]
  }
]

let convo = array.map(item => {
  return {
    name: item.name,
    ...item.arr,
  };
});

https://jsfiddle.net/3ng8dc2x/1/

我想得到类似的东西:

[
  {name: "name01"}, 
  {name: "inner01"}, 
  {name: "inner02"}, 
  {name: "inner03"},
  {name: "name02"},
  {name: "inner04"}, 
  {name: "inner05"}, 
  {name: "inner06"}
]

一如既往地感谢所有方向,所以在此先感谢您!

5 个答案:

答案 0 :(得分:5)

如果您是为最新的浏览器和最新的节点编写的,flatMap()则非常适合:

let array = [{
    name: "name01", 
    arr: [
      {name: "inner01"}, 
      {name: "inner02"}, 
      {name: "inner03"}
    ]
  }, {
    name: "name02", 
    arr: [
      {name: "inner04"}, 
      {name: "inner05"}, 
      {name: "inner06"}
    ]
  }
]

let flat = array.flatMap(({name, arr}) => [{name}, ...arr])
console.log(flat)

答案 1 :(得分:2)

数组reduce可能比map更好。

let array = [{
    name: "name01", 
    arr: [
      {name: "inner01"}, 
      {name: "inner02"}, 
      {name: "inner03"}
    ]
  }, {
    name: "name02", 
    arr: [
      {name: "inner04"}, 
      {name: "inner05"}, 
      {name: "inner06"}
    ]
  }
]

let convo = array.reduce((a, {name, arr}) => a.concat([{name}], arr), []);
console.log(convo)

答案 2 :(得分:0)

您可以使用reducedestructuring assignment

let array = [{name: "name01", arr: [{name: "inner01"}, {name: "inner02"}, {name: "inner03"}]},
{name: "name02", arr: [{name: "inner04"}, {name: "inner05"}, {name: "inner06"}]}]

let op = array.reduce((op,{name,arr}) =>op.concat([{name}],arr),[])

console.log(op)

答案 3 :(得分:0)

一种可能的解决方案是将Array.reduce()Object.entries组合在一起,对于当前检查的object的每个条目,检查类型以确定如何将元素放置在新数组上: / p>

let array = [
  {
    name: "name01", 
    surname: "surname01", 
    arr: [{name: "inner01"}, {name: "inner02"}, {name: "inner03"}]
  },
  {
    name: "name02",
    surname: "surname02",  
    arr: [{name: "inner04"}, {name: "inner05"}, {name: "inner06"}]
  }
];

let res = array.reduce((acc, curr) =>
{
    Object.entries(curr).forEach(([k, v]) =>
    {
        if (typeof v === 'string')
            acc.push({[k]: v});
        else if (Array.isArray(v))
            acc.push(...v);
    });

    return acc;
}, []);

console.log(res);
.as-console {background-color:black !important; color:lime;}
.as-console-wrapper {max-height:100% !important; top:0;}

请注意,前一种可能是通用解决方案,但是,如果您可以信任对象的结构,即它们都具有一个name属性,其中包含一个string和一个{{1 }}放在属性array上,则可以简化代码:

arr
let array = [
  {
    name: "name01", 
    arr: [{name: "inner01"}, {name: "inner02"}, {name: "inner03"}]
  },
  {
    name: "name02", 
    arr: [{name: "inner04"}, {name: "inner05"}, {name: "inner06"}]
  }
];

let res = array.reduce(
    (acc, {name, arr}) => acc.concat([{name}, ...arr]),
    []
);

console.log(res);

答案 4 :(得分:0)

使用Array.map()/ Array.reduce()进行功能编程的方法将达到目的,如其他答案所示。

让我提供一个替代的观点是使用递归。

const array = [{
    name: "name01", 
    arr: [
      {name: "inner01"}, 
      {name: "inner02"}, 
      {name: "inner03"}
    ]
  }, {
    name: "name02", 
    arr: [
      {name: "inner04"}, 
      {name: "inner05"}, 
      {name: "inner06"}
    ]
  }
]

const flattenToSingleArray = (array, result = []) => {
   for (const {name, arr} of array) {
     result.push({name});
     if (arr) {
       flattenToSingleArray(arr, result);
     }
   }
  return result;
}

console.log(flattenToSingleArray(array));

这是如何工作的,我们迭代array,然后迭代destructuring每个对象(每次迭代中的元素)。然后,我们将name属性及其值推入结果中。我们通过子对象(在每个对象中用arr表示)进行递归。

相关问题