如何使用es6展平嵌套的对象数组

Jan*_*lia 4 javascript arrays ecmascript-6

我有这个对象数组,在其中我有另一个对象数组,如何得到:

[
  { id: "5a60626f1d41c80c8d3f8a85" },
  { id: "5a6062661d41c80c8b2f0413" },
  { id: "5a60626f1d41c80c8d3f8a83" },
  { id: "5a60626f1d41c80c8d3f8a84" }
];
Run Code Online (Sandbox Code Playgroud)

从:

[
  {
    id: 1,
    country: [
      {
        id: "5a60626f1d41c80c8d3f8a85"
      },
      {
        id: "5a6062661d41c80c8b2f0413"
      }
    ]
  },
  {
    id: 2,
    country: [
      {
        id: "5a60626f1d41c80c8d3f8a83"
      },
      {
        id: "5a60626f1d41c80c8d3f8a84"
      }
    ]
  }
];
Run Code Online (Sandbox Code Playgroud)

不使用a forEach和temp变量?

当我做的时候:

(data || []).map(o=>{
  return o.country.map(o2=>({id: o2.id}))
})
Run Code Online (Sandbox Code Playgroud)

我得到了相同的结构.

nem*_*035 16

不需要任何ES6魔法,你可以通过连接内部country数组来减少数组.

const data=[{id:1,country:[{id:"5a60626f1d41c80c8d3f8a85"},{id:"5a6062661d41c80c8b2f0413"}]},{id:2,country:[{id:"5a60626f1d41c80c8d3f8a83"},{id:"5a60626f1d41c80c8d3f8a84"}]}];

console.log(
  data.reduce(
    (arr, elem) => arr.concat(elem.country), []
  )
)
Run Code Online (Sandbox Code Playgroud)

如果需要ES6功能(箭头功能除外),请使用数组传播而不是concat方法:

const data=[{id:1,country:[{id:"5a60626f1d41c80c8d3f8a85"},{id:"5a6062661d41c80c8b2f0413"}]},{id:2,country:[{id:"5a60626f1d41c80c8d3f8a83"},{id:"5a60626f1d41c80c8d3f8a84"}]}];

console.log(
  data.reduce(
    (arr, elem) => [...arr, ...elem.country], []
  )
)
Run Code Online (Sandbox Code Playgroud)

注意:这些建议将在每次迭代时创建一个新数组.

为了提高效率,你必须牺牲一些优雅:

const data=[{id:1,country:[{id:"5a60626f1d41c80c8d3f8a85"},{id:"5a6062661d41c80c8b2f0413"}]},{id:2,country:[{id:"5a60626f1d41c80c8d3f8a83"},{id:"5a60626f1d41c80c8d3f8a84"}]}];

console.log(
  data.reduce(
    (arr, elem) => {
      for (const c of elem.country) {
        arr.push(c);
      }
      return arr;
    }, []
  )
)
Run Code Online (Sandbox Code Playgroud)