Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/435.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用javascript按键对元素进行分组并附加特定键的值?_Javascript_Arrays_Json - Fatal编程技术网

如何使用javascript按键对元素进行分组并附加特定键的值?

如何使用javascript按键对元素进行分组并附加特定键的值?,javascript,arrays,json,Javascript,Arrays,Json,我需要按键对元素进行分组,并使用JavaScript附加该特定键的值。以下是实际数据和预期数据。谁能帮我修一下吗 实际值 [ { "num": 152332, "subReport": "HS_ONE" }, { "num": 152332, "subReport": "HS_TWO" }, { "num": 152331, "subReport": "HS_T

我需要按键对元素进行分组,并使用JavaScript附加该特定键的值。以下是实际数据和预期数据。谁能帮我修一下吗

实际值

[
    {
        "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(',')}));

控制台日志(结果)reduce
我们需要使用
find
,这将使
O(n2)
变得复杂,而这种方法是
O(n)
我的意思是,你不需要。您正在通过keyname访问对象。你也可以用reduce来做。