首页 > 解决方案 > 如何通过单线解决方案将包含对象数组的对象减少为内部对象?

问题描述

我有以下对象结构:

regions: [
  {
    name: reg1, 
    subregions: [
      {name: subreg11},
      {name: subreg12}
    ]
  },
  {
    name: reg2, 
    subregions: [
      {name: subreg21},
      {name: subreg22}
    ]
  }
]

我想要的是提取子区域的数组,如下所示:

[{name: subreg11}, {name: subreg12}, {name: subreg21}, {name: subreg22}]

...我想用一个单行 array.prototype-function 来做到这一点,比如 .filter、.map、.forEach 等。

我已经设法在这样的三行中做到了(包括我希望在单行中包含的返回语句):

let subregions = []
regions.forEach(reg => reg.subregions.forEach(subregion => subregions.push(subregion)))
return locs

有谁知道我该怎么做?

编辑 2020 年 7 月:我看到该问题已被@nina-sholz标记为重复,但我不相信这是真的。链接的问题是“ Why no Array.prototype.flatMap in javascript? ”,而我的问题是对解决问题方法的描述。我没有特别要求 flatMap 功能,并将其标记为重复只是说“您应该直观地知道那Array.prototype.flatMap是您正在寻找的东西”。

标签: javascriptarraysjavascript-objectssub-array

解决方案


flatMap并提取subregions属性:

const regions = [
  {
    name: 'reg1',
    subregions: [
      {name: 'subreg11'},
      {name: 'subreg12'}
    ]
  },
  {
    name: 'reg2', 
    subregions: [
      {name: 'subreg21'},
      {name: 'subreg22'}
    ]
  }
];

const output = regions.flatMap(({ subregions }) => subregions);
console.log(output);

您还可以使用reduce

const regions = [
  {
    name: 'reg1',
    subregions: [
      {name: 'subreg11'},
      {name: 'subreg12'}
    ]
  },
  {
    name: 'reg2', 
    subregions: [
      {name: 'subreg21'},
      {name: 'subreg22'}
    ]
  }
];

const output = regions.reduce((a, { subregions }) => a.concat(subregions), []);
console.log(output);

几乎任何 Javascript 代码都可以简化为一行,但不一定是可读的。


推荐阅读