Javascript组合数组对象中的项

Javascript组合数组对象中的项,javascript,arrays,node.js,object,Javascript,Arrays,Node.js,Object,我发现,reduce只保存了一组信息。应该使用什么选项来组合相似的信息 [ { fruit: 'apple', 'color': 'red' }, { fruit: 'apple', 'color': 'green' }, { fruit: 'pear', 'color': 'yellow' }, { fruit: 'pear', 'color': 'green' } ] 我期望的结果是: var

我发现,reduce只保存了一组信息。应该使用什么选项来组合相似的信息

[
  {
    fruit: 'apple',
    'color': 'red'
  },
  {
    fruit: 'apple',
    'color': 'green'
  },
  {
    fruit: 'pear',
    'color': 'yellow'
  },
  {
    fruit: 'pear',
    'color': 'green'
  }
]
我期望的结果是:

var items = [
  {
    fruit: 'apple',
    'color': 'red', 'green'
  },
  {
    fruit: 'pear',
    'color': 'green', 'yellow'
  }
]
我目前使用NodeJS的代码是:

 let result = Object.values(json.reduce((c, {fruit,...r}) => {
   c[fruit] = c[fruit] || {fruit};
   c[fruit] = Object.assign(c[fruit], r);
   return c;
 }, {}));

为此,您可以使用Array
reduce
方法。假设您的数组不是超长的,在每次迭代中使用
find
方法应该不会太昂贵。如果它是超长数组,您可以选择具有哈希表效率的中间对象。不过,可能没有必要

const arr=[
{
水果:“苹果”,
“颜色”:“红色”
},
{
水果:“苹果”,
“颜色”:“绿色”
},
{
水果:“梨”,
“颜色”:“黄色”
},
{
水果:“梨”,
“颜色”:“绿色”
}
];
const combled=arr.reduce((acc,el)=>{
const fruit=acc.find(item=>item.fruit==el.fruit);
果蔬{
水果.颜色.推送(el.颜色)
}否则{
acc.push({水果:el.FROUT,colors:[el.color]});
}
返回acc;
}, []);

控制台日志(组合)这是一种在时间O(n)而不是O(n^2)中运行的方法:


请注意,正如Nick在回答中所指出的,对于小数组来说,差异不会产生差异,但是如果数组很大,或者转换本身被包装在一个循环中,这可能很重要。

使用simple
forEach
构建具有唯一键的对象,并使用
object.values
获取值

const数据=[
{
水果:“苹果”,
颜色:“红色”
},
{
水果:“苹果”,
颜色:“绿色”
},
{
水果:“梨”,
颜色:“黄色”
},
{
水果:“梨”,
颜色:“绿色”
}
];
常数res={};
data.forEach(
项目=>
(决议[项目.成果]=
第1项:水果
?{…res[item.fruit],颜色:[…res[item.fruit]。颜色,item.color]}
:{fruit:item.fruit,color:[item.color]})
);
常量输出=对象值(res);

控制台日志(输出)
因为您使用的是lodash,所以请查看
\uuu.groupBy
。您可能需要额外的后处理步骤来实现最终的数据结构,但groupBy需要做大量的工作。
const arr = [
  {
    fruit: 'apple',
    'color': 'red',
  },
  {
    fruit: 'apple',
    'color': 'green',
  },
  {
    fruit: 'pear',
    'color': 'yellow',
  },
  {
    fruit: 'pear',
    'color': 'green',
  },
];
const map = arr.reduce((acc, o) => {
  if (acc[o.fruit]) {
    acc[o.fruit].push(o.color);
  } else {
    acc[o.fruit] = [o.color];
  }
  return acc;
}, {});
const result = Object.keys(map).map(k => ({ fruit: k, colors: map[k] }));
console.log(result);
return result;