如何使用javascript按键对元素进行分组并附加特定键的值?
我需要按键对元素进行分组,并使用JavaScript附加该特定键的值。以下是实际数据和预期数据。谁能帮我修一下吗 实际值如何使用javascript按键对元素进行分组并附加特定键的值?,javascript,arrays,json,Javascript,Arrays,Json,我需要按键对元素进行分组,并使用JavaScript附加该特定键的值。以下是实际数据和预期数据。谁能帮我修一下吗 实际值 [ { "num": 152332, "subReport": "HS_ONE" }, { "num": 152332, "subReport": "HS_TWO" }, { "num": 152331, "subReport": "HS_T
[
{
"num": 152332,
"subReport": "HS_ONE"
},
{
"num": 152332,
"subReport": "HS_TWO"
},
{
"num": 152331,
"subReport": "HS_THREE"
},
{
"num": 152331,
"subReport": "HS_FOUR"
}
]
预期的
[
{
"num": 152332,
"subReport": "HS_ONE,HS_TWO"
},
{
"num": 152331,
"subReport": "HS_THREE,HS_FOUR"
}
]
您可以简单地循环数组,并使用
num
上的unique键创建自定义对象数据结构。然后,获取对象的值以按预期生成最终数组:
var-arr=[{
“num”:152332,
“子报告”:“HS_位”
},
{
“num”:152332,
“子报告”:“HS_日志”
},
{
“num”:152331,
“子报告”:“HS_日志”
},
{
“num”:152331,
“子报告”:“HS_概述”
}
];
设resObj={};
arr.forEach((obj)=>{
if(resObj[obj.num]){
resObj[obj.num].子报表+=','+obj.subReport
}否则{
resObj[obj.num]=obj;
}
});
var resArray=对象值(resObj);
控制台日志(重新排列)代码>您可以使用减少和查找:
const arr=[
{num:152332,子报告:'HS_BIT'},
{num:152332,子报告:'HS_LOG'},
{num:152331,子报告:'HS_LOG'},
{num:152331,子报告:'HS_GENERAL'}
]
const out=arr.reduce((a,o)=>{
const item=a.find(i=>i.num==o.num)
item?(item.subReport=`${item.subReport},${o.subReport}`):a.push(o)
归还
}, [])
console.log(out)
您可以使用Map
和reduce
let data=[{“num”:152332,“子报告”:“HS_位”},{“num”:152332,“子报告”:“HS_日志”},{“num”:152331,“子报告”:“HS_日志”},{“num”:152331,“子报告”:“HS_常规”}]
让final=data.reduce((op,{num,subReport})=>{
op.set(num,op.get(num)&&(op.get(num)+','+子报表)| |子报表)
返回操作
},新映射())
让输出=[…final].map([num,subReport])=>({num,subReport}))
console.log(输出)
您可以执行以下操作:
const data=[{“num”:152332,“subReport”:“HS_ONE”},{“num”:152332,“subReport”:“HS_TWO”},{“num”:152331,“subReport”:“HS_THREE”},{“num”:152331,“subReport”:“HS_FOUR”};
const obj=data.reduce((a,{num,subReport})=>(a[num]=a[num]?[…a[num],subReport]:[subReport],a),{});
const result=Object.keys(obj.map)(k=>({num:k,子报表:obj[k].join(',')}));
控制台日志(结果)你试过什么了吗?我相信这会有所帮助。请给出一些代码,说明您迄今为止所做的工作。我认为解决这个问题的一个很好的方法是遍历数组并生成一个新数组,对于每个新的num,您创建一个对象(如果它已经存在),您附加子报表,您可以使用一些方法,如reduce或doloop@Nico:我刚刚生成了您可以在上面看到的实际数据。我正在努力获得预期的数据。让我试试你建议的方法。@sp00m谢谢。我将使用reduce@Nithin没问题。如果你需要更多的帮助,尽管问我,我不知道你为什么不在这里使用reduce?你实际上是在外部使用一个对象,它可以在reduce内部使用,而不牺牲性能?使用reduce
我们需要使用find
,这将使O(n2)
变得复杂,而这种方法是O(n)
我的意思是,你不需要。您正在通过keyname访问对象。你也可以用reduce来做。