如何在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]);
控制台日志(结果)你能分享一下你已经尝试过的方法吗?你需要减少你的数组。这太棒了!这比我提出的方法简单得多。虽然这是ES6唯一正确的方法?由于。。。此处的spread运算符Yes spread运算符是ES6,但您可以使用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);