Javascript 如何在对象文本数组中循环,连接共享重复id的值?
我需要一种有效的方法来循环遍历对象文本数组,并在具有重复ID的对象中连接值 与嵌套多个for循环相比,有没有更优雅的方法 例如,我得到的数据如下:Javascript 如何在对象文本数组中循环,连接共享重复id的值?,javascript,arrays,javascript-objects,Javascript,Arrays,Javascript Objects,我需要一种有效的方法来循环遍历对象文本数组,并在具有重复ID的对象中连接值 与嵌套多个for循环相比,有没有更优雅的方法 例如,我得到的数据如下: { "theList": [ { "id": 101, "name": "Bubbles' Cat Farm", "number": "123" }, { "id": 102, "name": "Sunnyvale Park", "
{ "theList": [
{
"id": 101,
"name": "Bubbles' Cat Farm",
"number": "123"
},
{
"id": 102,
"name": "Sunnyvale Park",
"number": "456"
},
{
"id": 101,
"name": "Bubbles' Cat Farm",
"number": "789"
]};
预期结果应该是:
{ "theList": [
{
"id": 101,
"name": "Bubbles' Cat Farm",
"number": "123, 789"
},
{
"id": 102,
"name": "Sunnyvale Park",
"number": "456"
]}
如果number是唯一具有不同值的键,则可以使用reduce执行以下操作:
const input={theList:[{id:101,name:Bubbles'Cat Farm,number:123},{id:102,name:Sunnyvale Park,number:456},{id:101,name:Bubbles'Cat Farm,number:789}]
const merged=input.theList.reduceac,{id,name,number}=>{
acc[id]
?acc[id][编号]+=,+编号
:acc[id]={id,name,number};
返回acc
},{}
const final={theList:Object.valuesmerged}
console.logfinal如果number是唯一具有不同值的键,则可以使用reduce执行类似操作:
const input={theList:[{id:101,name:Bubbles'Cat Farm,number:123},{id:102,name:Sunnyvale Park,number:456},{id:101,name:Bubbles'Cat Farm,number:789}]
const merged=input.theList.reduceac,{id,name,number}=>{
acc[id]
?acc[id][编号]+=,+编号
:acc[id]={id,name,number};
返回acc
},{}
const final={theList:Object.valuesmerged}
console.logfinal您可以将容器设置为字典,其中键是ID,每个值都是空列表。所以当你循环原始数据时。如果密钥不存在,请创建一个包含一项的列表。如果键已经存在,只需将值附加到列表中。您可以将容器设置为字典,其中键是ID,每个值都是空列表。所以当你循环原始数据时。如果密钥不存在,请创建一个包含一项的列表。如果键已经存在,只需将值附加到列表中。您可以使用 让obj=[{id:101,名称:泡泡猫农场,编号:123},{id:102,名称:桑尼维尔公园,编号:456},{id:101,名称:泡泡猫农场,编号:789}]; 设op=obj.reduceout,inp=>{ ifout[inp.id]{ out[inp.id].number+=','+inp.number; }否则{ out[inp.id]=inp } 返回 },{} console.logObject.valuesop您可以使用 让obj=[{id:101,名称:泡泡猫农场,编号:123},{id:102,名称:桑尼维尔公园,编号:456},{id:101,名称:泡泡猫农场,编号:789}]; 设op=obj.reduceout,inp=>{ ifout[inp.id]{ out[inp.id].number+=','+inp.number; }否则{ out[inp.id]=inp } 返回 },{} console.logObject.valuesop使用reduce和findIndex函数,您将能够实现您想要的功能 常量数组=[{ id:101, 名称:泡泡猫农场, 电话:123 }, { id:102, 名称:桑尼维尔公园, 电话:456 }, { id:101, 名称:泡泡猫农场, 电话:789 } ] const result=array.reduceacum,cv=>{ const index=accum.findIndexitem=>item.id==cv.id; 如果索引==-1{ 累积pushcv; }否则{ 累计[索引]。编号+=,+cv.number; } 返回累计; }, [] console.logresult使用reduce和findIndex函数,您将能够实现您想要的 常量数组=[{ id:101, 名称:泡泡猫农场, 电话:123 }, { id:102, 名称:桑尼维尔公园, 电话:456 }, { id:101, 名称:泡泡猫农场, 电话:789 } ] const result=array.reduceacum,cv=>{ const index=accum.findIndexitem=>item.id==cv.id; 如果索引==-1{ 累积pushcv; }否则{ 累计[索引]。编号+=,+cv.number; } 返回累计; }, []
console.logresultunless如果数据结构不总是id、名称、编号,则只需1个循环就可以了。除非数据结构不总是id、名称、编号,否则只需1个循环就可以了。能否显示一点代码来澄清?能否显示一点代码来澄清?