Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/362.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_Data Structures_Functional Programming - Fatal编程技术网

如何在javascript中遍历和比较数组元素中的对象

如何在javascript中遍历和比较数组元素中的对象,javascript,arrays,data-structures,functional-programming,Javascript,Arrays,Data Structures,Functional Programming,给定以下数组结构: [{ _id: '1234', characteristics: [[Object], [Object]]}, { _id: '1234',characteristics: [[Object], [Object]]}, { _id: '4567', characteristics: [[Object], [Object]]}, { _id: '4567',characteristics: [ [Object], [Object]]}, { _id: '4987',charac

给定以下数组结构:

[{ _id: '1234', characteristics: [[Object], [Object]]},
{ _id: '1234',characteristics: [[Object], [Object]]},
{ _id: '4567', characteristics: [[Object], [Object]]},
{ _id: '4567',characteristics: [ [Object], [Object]]},
{ _id: '4987',characteristics: [ [Object], [Object]]}]
如何比较一个数组元素和下一个数组元素,并合并具有相同id的对象

最终的结果是

[ { _id: '1234', characteristics: [ [Object], [Object] ,[Object], [Object] ]},
 { _id: '4567',characteristics: [ [Object], [Object] , [Object], [Object]]},
 { _id: '4987', characteristics: [ [Object], [Object] ] } ]
基本上,id为1234的两个对象内部的对象在“特征”下合并在一起

我已经盯着这个看了两个小时了,有人知道吗?我更喜欢更实用的方法

编辑:我使用的解决方案基于Nenad Vracar的解决方案

function mergeDupKey(data) {
    var o = {}
    return data.reduce(function(r, e) {
        if (!o[e._id]) {
            o[e._id] = e;
            r.push(o[e._id]);
        } else {
            o[e._id].characteristics = o[e._id].characteristics.concat(e.characteristics);
    }
    return r;
}, [])
}

var g = mergeDupKey(data)`
可以对一个辅助对象使用
reduce()
。您也可以使用
concat()
而不是
..
push()

var data=[{u id:'1234',特征:[[1],[2]},
{{u id:'1234',特征:[[3],[4]},
{{u id:'4567',特征:[[5],[6]},
{{u id:'4567',特征:[[7],[8]},
{u id:'4987',特征:[[9],[10]}];
var o={}
var结果=数据.reduce(函数(r,e){
如果(!o[e.\u id]){
o[e._id]=e;
r、 推送(o[e.[U id]);
}否则{
o[e._id].characteristics.push(…e.characteristics);
}
返回r;
}, [])

console.log(result)
这可以通过
.reduce()
完成。不需要辅助对象

var data=[{u id:'1234',特征:[[1],[2]},
{{u id:'1234',特征:[[3],[4]},
{{u id:'4567',特征:[[5],[6]},
{{u id:'4567',特征:[[7],[8]},
{u id:'4987',特征:[[9],[10]}];
var=false;
var结果=数据减少(函数(上一个,当前){
上一个forEach(功能(obj){
如果(对象id==当前id){
对象特性=对象特性concat(电流特性);
发现=真;
}
});
如果(!找到)
上推(当前);
发现=错误;
返回上一个;
}, []);

console.log(result)
使用
Array.prototype.reduce
和哈希表对属性进行分组-请参阅下面的演示:

var数组=[{u id:'1234',特征:[[1],[2]]},{u id:'1234',特征:[[3],[4]},{u id:'4567',特征:[[5],[6]},{u id:'4567',特征:[[7],[8]},{u id:'4987',特征:[[9],[10]};
var result=array.reduce(函数(散列){
返回函数(上一个、当前){
if(散列[curr.\u id]){
当前特征。forEach(函数(e){
哈希[curr.\u id].push(e);
});
}否则{
哈希[curr.\u id]=当前特征;
prev.push({u-id:curr.\u-id,特征:hash[curr.\u-id]})
}
返回上一个;
};
}(Object.create(null)),[]);
控制台日志(结果)
.as控制台包装{top:0;最大高度:100%!important;}
使用ES5方法:

var lst = [{ _id: '1234', characteristics: [[Object], [Object]]},
{ _id: '1234',characteristics: [[Object], [Object]]},
{ _id: '4567', characteristics: [[Object], [Object]]},
{ _id: '4567',characteristics: [ [Object], [Object]]},
{ _id: '4987',characteristics: [ [Object], [Object]]}];

var result = [];

var findById = function(id) {
    for (var i = 0; i < result.length; i++) {
        var item = result[i];
        if (item._id === id) {
            return item;
        }
    }
    var newitem = { _id: id, characteristics: [] };
    result.push(newitem);
    return newitem;
}

lst.forEach(function(item) {
    var aux = findById(item._id);
    aux.characteristics.concat(item.characteristics);
});

console.log(result);
你可以这样做

var data=[{u id:'1234',特征:[[“whatever”],[“whatever”]},
{{u id:'1234',特征:[[“whatever”],[“whatever”]},
{{u id:'4567',特征:[[“无论如何],[“无论如何”]},
{{u id:'4567',特征:[[“无论如何],[“无论如何”]},
{{u id:'4987',特征:[[“whatever”],[“whatever”]},
lut=data.reduce((p,c)=>p[c.\u id]?(p[c.\u id].characteristics.push(…c.characteristics),p)
:(p[c._id]=c,p),{};
结果=对象键(lut)
.map(k=>lut[k]);

控制台日志(结果)concat()
var lst = [{ _id: '1234', characteristics: [[Object], [Object]]},
{ _id: '1234',characteristics: [[Object], [Object]]},
{ _id: '4567', characteristics: [[Object], [Object]]},
{ _id: '4567',characteristics: [ [Object], [Object]]},
{ _id: '4987',characteristics: [ [Object], [Object]]}];

var result = [];

lst.forEach(item => {
    var aux = result.find(it => it._id === item._id);
    if (!aux) {
        aux = { _id: item._id, characteristics: [] };
        result.push(aux);
    }
    aux.characteristics.concat(item.characteristics);
});

console.log(result);