将对象数组转换为对象数组的数组

3
我正在从足球API中检索数据。我需要的具体数据是一个对象数组(306个对象)。每个对象都有一个名为matchday的属性,其值为数字。我想将所有具有相同属性的对象分组并存储在一个数组中。最终我需要的是一个对象数组的数组。 对象数组示例:
[
  {id: 264796, matchday: 1, …},
  {id: 264797, matchday: 1, …},
  {id: 264798, matchday: 2, …},
  {id: 264800, matchday: 2, …},
]

我想要的是这样的:
[
  [{id: 264796, matchday: 1, …},{id: 264797, matchday: 1, …}],
  [{id: 264798, matchday: 2, …},{id: 264800, matchday: 2, …}],
]

@CBroe:这个问题比我在这里看到的大多数问题都要好。 - Robert Harvey
4个回答

4
您可以使用 .reduce()Object.values() 来获取所需的输出结果:

const data = [
  {id: 264796, matchday: 1}, {id: 264797, matchday: 1},
  {id: 264798, matchday: 2}, {id: 264800, matchday: 2}
];

const result = Object.values(
  data.reduce((r, c) => {
    r[c.matchday] = r[c.matchday] || [];
    r[c.matchday].push(c);
    return r;
  }, {})
);

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


谢谢Mohammad! - Noud

1

除了现有的答案之外,这里是另一种利用Map和一个predicate确定分组值的方法:

const groupBy = predicate => items => 
     Array.from(items.reduce((agg, next) => {
        const key = predicate(next);
        return agg.set(key, [].concat(agg.get(key) || []).concat(next));
    }, new Map()).values());


const data = [
{name: 'A', key: 1},
{name: 'B', key: 1},
{name: 'C', key: 2},
{name: 'D', key: 2},
{name: 'E', key: 3}
];

const grouped = groupBy(x => x.key)(data);

为了好玩,这里有一个groupBy的递归版本:

const groupBy = predicate => function group([next, ...items], grouped = new Map()) {
    if (!next) {
        return Array.from(grouped.values())
    }

    const key = predicate(next);
    return group(items, grouped.set(key, [...(grouped.get(key) || []), next]));
}

顺便说一句,这里还有一种更加强制的方法可供选择:

const groupBy = predicate => items => {
    const cache = {};

    for(item of items) {
        const key = predicate(item);
        cache[key] = [].concat(cache[key]).concat(item).filter(x => x)
    }

    return Object.values(cache);
}

1
我们可以使用reduce

const arr = [
  {id: 264796, matchday: 1},
  {id: 264797, matchday: 1},
  {id: 264798, matchday: 2},
  {id: 264800, matchday: 2},
]

const result = arr.reduce((acc, item) => {

  if (!acc.find(accSubArr => accSubArr.find(accSubArrItem => accSubArrItem.matchday === item.matchday))) {
    acc.push(arr.filter(arrItem => arrItem.matchday === item.matchday))
  }
  return acc;
}, [])

console.log(result)


1
你可以尝试这个:

const data = [{
    id: 264796,
    matchday: 1
  },
  {
    id: 264797,
    matchday: 1
  },
  {
    id: 264798,
    matchday: 2
  },
  {
    id: 264800,
    matchday: 2
  },
]

const group = data
  .map(d => d.matchday)
  .filter((v, i, c) => c.indexOf(v) === i)
  .map(i => data.filter(d => d.matchday === i))

console.log(group)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接