将一个键值相同但另一个键值不同的数组对象合并为内部数组



我有一个数组,其中有键eventIdselectedNumber。在数组中,同一个eventid可以出现在多个对象中,但selectedNumber的值总是不同的。我的目标是制作一个嵌套数组,其中每个对象都有唯一的eventId,但是selectedNumber将成为一个数组,其中每个对象都有相同的eventId。我尝试使用lodash _groupby()方法,但它只是将对象组合成数组,并将其添加到键为eventId的值。我不想那样。怎么做呢?

Input:--
[{
"eventId" : "636939dde9341f2fbbc7256e",
"selectedNumber" : "20"
},
{
"eventId" : "636939dde9341f2fbbc7256e",
"selectedNumber" : "30"
},
{
"eventId" : "63693a55e9341f2fbbc725c0",
"selectedNumber" : "50"
}]
Result:--

[{
"eventId" : "636939dde9341f2fbbc7256e",
"selectedNumber" : ["20", "30"]
},
{
"eventId" : "63693a55e9341f2fbbc725c0",
"selectedNumber" : "50"
}]

let newarr = [] 
oldArr.map((x,i)=>{ 
if(i==0){ 
const numArr = [] 
numArr.push(x.selectedNumber) 
delete x.selectedNumber 
x.numArr = numArr newarr.push(x) 
}else{ 
if(oldArr[i].eventId == oldArr[i-1].eventId){
const temp = x.selectedNumber 
delete x.selectedNumber
newarr[i-1].numArr.push(temp) 
}else{ 
const numArr = [] 
numArr.push(x.selectedNumber) 
delete x.selectedNumber 
x.numArr = numArr 
newarr.push(x) 
} 
} 
})

只需将您的输入减少到一个对象,并将对象条目映射到所需的数组格式:

const input = [{
"eventId" : "636939dde9341f2fbbc7256e",
"selectedNumber" : "20"
},
{
"eventId" : "636939dde9341f2fbbc7256e",
"selectedNumber" : "30"
},
{
"eventId" : "63693a55e9341f2fbbc725c0",
"selectedNumber" : "50"
}];
const result = Object.entries(input.reduce((a, {eventId, selectedNumber}) => {
a[eventId] = a[eventId] || [];
a[eventId].push(selectedNumber)
return a;
}, {})).map(([eventId, selectedNumber]) => ({ eventId, selectedNumber }));
console.log(result);

不创建中间查找对象,您可以直接减少到一个数组,但这会对解决方案的时间复杂度产生负面影响。

最新更新