如果具有相同的 id,如何将数组对象值合并到数组

Ear*_*dsa 1 javascript lodash

如果它具有相同的 id,我想将值合并到数组中。我有一组这样的对象。

[ 
 { 
   id: 'Tony',
   type: 'hero',
   favorite: 'Rosie',
 },
 { 
   id: 'Jane',
   type: 'human',
   favorite: null,
 },
 { 
   id: 'Tony',
   type: 'hero',
   favorite: 'Lisa',
 },
 { 
   id: 'Steve',
   type: 'hero',
   favorite: 'Jennie',
 },
 { 
   id: 'Tony',
   type: 'hero',
   favorite: 'Jisoo',
 },
]

Run Code Online (Sandbox Code Playgroud)

我想将键favorite从字符串合并到数组。我想要这样的输出

[ 
 { 
   id: 'Tony',
   type: 'hero',
   favorite: ['Rosie', 'Lisa', 'Jisoo'],
 },
 { 
   id: 'Jane',
   type: 'human',
   favorite: null,
 },
 { 
   id: 'Steve',
   type: 'hero',
   favorite: ['Jennie'],
 } 
Run Code Online (Sandbox Code Playgroud)

我尝试编写这样的代码:(来自:Sumimilarkeysin an array ofobjects

var obj = [
    {
      id: 'Tony',
      type: 'hero',
      favorite: 'Rosie',
    },
    {
      id: 'Jane',
      type: 'human',
      favorite: null,
    },
    {
      id: 'Tony',
      type: 'hero',
      favorite: 'Lisa',
    },
    {
      id: 'Steve',
      type: 'hero',
      favorite: 'Jennie',
    },
    {
      id: 'Tony',
      type: 'hero',
      favorite: 'Jisoo',
    },
  ];

  var holder = {};
  const ar = []
  obj.forEach(function (d) {
    if (holder.hasOwnProperty(d.id)) {
      holder[d.id] = ar.push(holder[d.id] + d.favorite);
    } else {
      holder[d.id] = d.favorite;
    }
  });

  var obj2 = [];

  for (var prop in holder) {
    obj2.push({ name: prop, favorite: holder[prop] });
  }

  console.log(obj2);

Run Code Online (Sandbox Code Playgroud)

但输出是

[ { name: 'Tony', favorite: 2 },
  { name: 'Jane', favorite: null },
  { name: 'Steve', favorite: 'Jennie' } ]
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点 ?

Akr*_*ion 6

您可以使用单个Array.reduce来完成此操作,并且很可能是最简单且性能最高的方法:

var data = [ { id: 'Tony', type: 'hero', favorite: 'Rosie', }, { id: 'Jane', type: 'human', favorite: null, }, { id: 'Tony', type: 'hero', favorite: 'Lisa', }, { id: 'Steve', type: 'hero', favorite: 'Jennie', }, { id: 'Tony', type: 'hero', favorite: 'Jisoo', }, ]

let result = data.reduce((r, {id,type,favorite}) => {
  r[id] = r[id] || {id, type, favorite: []}
  r[id].favorite.push(favorite)
  return r
}, {})

console.log(Object.values(result))
Run Code Online (Sandbox Code Playgroud)

这个想法是“分组” id,然后favorites在每次迭代中继续推送到数组。

因为ES5你可以用类似的方式做到这一点:

var data = [ { id: 'Tony', type: 'hero', favorite: 'Rosie', }, { id: 'Jane', type: 'human', favorite: null, }, { id: 'Tony', type: 'hero', favorite: 'Lisa', }, { id: 'Steve', type: 'hero', favorite: 'Jennie', }, { id: 'Tony', type: 'hero', favorite: 'Jisoo', }, ]

let result = data.reduce(function(r, c){
   r[c.id] = r[c.id] || {id: c.id, type: c.type, favorite: []}
   r[c.id].favorite.push(c.favorite)
   return r
}, {})

console.log(Object.values(result))
Run Code Online (Sandbox Code Playgroud)

确实没有必要lodash实现这一点。