Javascript 根据嵌套对象数组中的键组合对象数组的结果
我有一个对象数组,我想在其中根据特定id过滤和合并结果。以下是示例:Javascript 根据嵌套对象数组中的键组合对象数组的结果,javascript,arrays,javascript-objects,Javascript,Arrays,Javascript Objects,我有一个对象数组,我想在其中根据特定id过滤和合并结果。以下是示例: [ { id: 1, items: [ { id: 10, values: [11], }, { id: 20, values: [13, 14, 15], },
[
{
id: 1,
items: [
{
id: 10,
values: [11],
},
{
id: 20,
values: [13, 14, 15],
},
],
},
{
id: 2,
items: [
{
id: 10,
values: [12],
},
{
id: 20,
values: [13, 15],
},
],
},
];
这是预期的结果:
[
{
id: 10,
values: [11, 12],
},
{
id: 20,
values: [13, 14, 15],
},
];
我还需要过滤重复项。谢谢
注意:如果我想要这个结果怎么办
[
{
// here I want value for id 10 (it will be always one number)
value: 11,
// here I want values for id 20 (array of numbers) => remove possible duplicates
values: [13, 14, 15],
},
{
// here I want value for id 10 (it will be always one number)
value: 12,
// here I want values for id 20 (array of numbers) => remove possible duplicates
values: [13, 15],
},
];
我用Map尝试了同样的方法,但没有成功。基本上,我希望根据ID组合值
项
数组重新创建数组。减少并将基于id的值推送到新的值对象中
Array.filter
忽略数组上的重复值Object.values
仅返回数组格式的对象值const arr=[{id:1,项:[{id:10,值:[11],},{id:20,值:[13,14,15],},},},},{id:2,项:[{id:10,值:[12],},{id:20,值:[13,15],},},},},];
const res=Object.values(arr.flatMap(({items})=>items)
.reduce((acc,{id,values})=>{
acc[id]=acc[id]?{id,值:[]};
//检查对象是否存在
让newArr=acc[id]['values'].concat(值);
设valArr=newArr.filter((v,i)=>newArr.indexOf(v)==i)
//删除重复项
acc[id]['values']=valArr
返回acc
},{}))
console.log(res)
请参阅。如果我想要此结果怎么办?
您的id与您的问题不匹配。有点困惑,请解释一下你的情况more@prasanth我编辑了我的问题。你可以在我想要达到的结果中找到评论。谢谢。非常感谢您的帮助。如果您想要更快的代码,请尝试以下方法:让res=[];设map=newmap();arr.flatMap(el=>el.items).forEach(el=>{map.set(el.id,map.get(el.id)?[…map.get(el.id),…el.values]:el.values);});map.forEach((value,key)=>{res.push({id:key,value:value.filter(function(item,pos){return value.indexOf(item)==pos;})});})@moustafa Nice.,请作为答案发布,而不是评论。而且您正在使用更多的forEach
循环。我不知道两者的速度差。我可以知道怎么做吗?@prasanth我编辑了这个问题,我尽力了,但我需要帮助。@marek8623检查我的最新答案。无法根据id自动拾取。因此,您将value的id,values
作为参数传递<代码>检测器功能验证id是否存在