JavaScript 原生 groupBy 归约

标签 javascript arrays functional-programming reduce

我正在使用 JavaScript 原生 reduce,但是我想稍微改变分组以获得我想要的结果。 我有一个数组如下:

const people = [
  {name: "John", age: 23, city: "Seattle", state: "WA"},
  {name: "Mark", age: 25, city: "Houston", state: "TX"},
  {name: "Luke", age: 26, city: "Seattle", state: "WA"},
  {name: "Paul", age: 28, city: "Portland", state: "OR"},
  {name: "Matt", age: 21, city: "Oakland", state: "CA"},
  {name: "Sam", age: 24, city: "Oakland", state: "CA"}
]

我想把它分组,改成这样:

const arranged = [
  {
    city: "Seattle",
    state: "WA",
    persons: [
      { name: "John", age: 23 },
      {name: "Luke", age: 26}
    ]
  },
    {
    city: "Houston",
    state: "TX",
    persons: [
      {name: "Mark", age: 25}
    ]
  },
  {
    city: "Portland",
    state: "OR",
    persons : [
      {name: "Paul", age: 28}
    ]
  },
  {
    city: "Oakland",
    state: "CA",
    persons: [
      {name: "Matt", age: 21},
      {name: "Sam", age: 24}
    ]
  }
]

最佳答案

你可以使用 Map和一个字符串化对象作为分组的键。

稍后用键和分组的人的对象渲染想要的数组。

var people = [{ name: "John", age: 23, city: "Seattle", state: "WA" }, { name: "Mark", age: 25, city: "Houston", state: "TX" }, { name: "Luke", age: 26, city: "Seattle", state: "WA" }, { name: "Paul", age: 28, city: "Portland", state: "OR" }, { name: "Matt", age: 21, city: "Oakland", state: "CA" }, { name: "Sam", age: 24, city: "Oakland", state: "CA" }],
    arranged = Array.from(
        people.reduce((m, o) => {
            var key = JSON.stringify(Object.assign(...['city', 'state'].map(k => ({ [k]: o[k] }))));
            return m.set(key, (m.get(key) || []).concat({ name: o.name, age: o.age }));
        }, new Map),
        ([key, persons]) => Object.assign(JSON.parse(key), { persons })
    );

console.log(arranged);
.as-console-wrapper { max-height: 100% !important; top: 0; }

关于JavaScript 原生 groupBy 归约,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49436776/

相关文章:

javascript - 在鼠标悬停时为 td 着色

javascript - 如何 forEach where (angular.js)

arrays - fatal error : Index out of Range Swift 3. 1

functional-programming - Fortran是纯功能性语言吗?

javascript - 使用 `Task` 将 `Some` 从 `Left` 转换或过滤到 `fp-ts`

javascript - NIVO slider 问题

javascript - "Simulate"JavaScript 中的 32 位整数溢出

java - 查找二维数组的可能组合

java - Optional<T> 当isPresent() 获取属性时为null 或为null; Java 8 中的函数式风格

javascript - Jquery 垂直制表符未知间隙和对齐方式