循环遍历一个集合并返回一个新集合,其中组合了具有相同id的对象

Loop through a collection and return a new collection where objects with the same id are combined

本文关键字:一个 集合 id 对象 组合 返回 合并 遍历 新集合 循环      更新时间:2023-09-26

假设我有一个javascript数组

var events = [
  {id: 1, name: 'Football Game', invitees: ['Gary', 'Jane']},
  {id: 2, name: 'Football Game', invitees: ['Gary', 'Jane']},
  {id: 2, name: 'Football Game', invitees: ['Gary', 'Jane','Bella']},
  {id: 3, name: 'Football Game', invitees: ['Gary', 'Jane']},
  {id: 4, name: 'Football Game', invitees: ['Gary', 'Jane']},
  {id: 5, name: 'Football Game', invitees: ['Gary', 'Jane']},
  {id: 5, name: 'Football Game', invitees: ['Ted', 'Laura']},
  {id: 5, name: 'Football Game', invitees: ['Jim', 'Samantha']},
];

我需要的是将这个数组缩减成这样:

var events = [
  {id: 1, name: 'Football Game', invitees: ['Gary', 'Jane']},
  {id: 2, name: 'Football Game', invitees: ['Gary', 'Jane','Bella']},
  {id: 3, name: 'Football Game', invitees: ['Gary', 'Jane']},
  {id: 4, name: 'Football Game', invitees: ['Gary', 'Jane']},
  {id: 5, name: 'Football Game', invitees: ['Gary', 'Jane', 'Ted', 'Laura', 'Jim', 'Samantha']}
];

数组被简化为每个id只有一个对象,并且每个对象中的受邀者数组显示所有受邀者。

在这里我很难开始基本的逻辑。

您可以对reduce()forEach()这样做。

var events = [
  {id: 1, name: 'Football Game', invitees: ['Gary', 'Jane']},
  {id: 2, name: 'Football Game', invitees: ['Gary', 'Jane']},
  {id: 2, name: 'Football Game', invitees: ['Gary', 'Jane','Bella']},
  {id: 3, name: 'Football Game', invitees: ['Gary', 'Jane']},
  {id: 4, name: 'Football Game', invitees: ['Gary', 'Jane']},
  {id: 5, name: 'Football Game', invitees: ['Gary', 'Jane']},
  {id: 5, name: 'Football Game', invitees: ['Ted', 'Gary', 'Laura']},
  {id: 5, name: 'Football Game', invitees: ['Jim', 'Samantha']}
];
var o = {}
var result = events.reduce(function(r, e) {
  if (!o[e.id]) {
    o[e.id] = e;
    r.push(o[e.id]);
  } else {
    e.invitees.forEach(function(a) {
      if (o[e.id].invitees.indexOf(a) == -1) o[e.id].invitees.push(a);
    })
  }
  return r;
}, [])
console.log(result)

您也可以使用Set代替forEach()循环来删除重复项。

var events = [
  {id: 1, name: 'Football Game', invitees: ['Gary', 'Jane']},
  {id: 2, name: 'Football Game', invitees: ['Gary', 'Jane']},
  {id: 2, name: 'Football Game', invitees: ['Gary', 'Jane','Bella']},
  {id: 3, name: 'Football Game', invitees: ['Gary', 'Jane']},
  {id: 4, name: 'Football Game', invitees: ['Gary', 'Jane']},
  {id: 5, name: 'Football Game', invitees: ['Gary', 'Jane']},
  {id: 5, name: 'Football Game', invitees: ['Ted', 'Gary', 'Laura']},
  {id: 5, name: 'Football Game', invitees: ['Jim', 'Samantha']}
];
var o = {}
var result = events.reduce(function(r, e) {
  if (!o[e.id]) {
    o[e.id] = e;
    r.push(o[e.id]);
  } else {
    o[e.id].invitees = [...new Set(o[e.id].invitees.concat(e.invitees))];
  }
  return r;
}, [])
console.log(result)

您可以使用以下ES6 函数式编程样式的代码:

var result = Array.from (
    events.reduce ( (acc, obj) => acc.set(obj.id,
        Object.assign({}, obj, {invitees: [...new Set(
            [...(acc.get(obj.id) || obj).invitees, ...obj.invitees] )]})
    ), new Map() ), ([id, obj]) => obj );

var events = [
  {id: 1, name: 'Football Game', invitees: ['Gary', 'Jane']},
  {id: 2, name: 'Football Game', invitees: ['Gary', 'Jane']},
  {id: 2, name: 'Football Game', invitees: ['Gary', 'Jane','Bella']},
  {id: 3, name: 'Football Game', invitees: ['Gary', 'Jane']},
  {id: 4, name: 'Football Game', invitees: ['Gary', 'Jane']},
  {id: 5, name: 'Football Game', invitees: ['Gary', 'Jane']},
  {id: 5, name: 'Football Game', invitees: ['Ted', 'Laura']},
  {id: 5, name: 'Football Game', invitees: ['Jim', 'Samantha']},
];
var result = Array.from (
    events.reduce ( (acc, obj) => acc.set(obj.id,
        Object.assign({}, obj, {invitees: [...new Set(
            [...(acc.get(obj.id) || obj).invitees, ...obj.invitees] )]})
    ), new Map() ), ([id, obj]) => obj );
  
console.log(result);