Javascript组合数组对象中的项
我发现,reduce只保存了一组信息。应该使用什么选项来组合相似的信息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
[
{
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在回答中所指出的,对于小数组来说,差异不会产生差异,但是如果数组很大,或者转换本身被包装在一个循环中,这可能很重要。使用simpleforEach
构建具有唯一键的对象,并使用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;