给出以下数组结构:
[{ _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的对象内的对象在特征下合并在一起。
过去2个小时我一直在盯着这个,有谁有任何想法?我更喜欢更实用的方法。
修改:我使用的解决方案基于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)`
答案 0 :(得分:2)
您可以将reduce()
与一个辅助对象一起使用。您也可以使用concat()
代替...
和push()
like this
var data = [{ _id: '1234', characteristics: [[1], [2]]},
{ _id: '1234',characteristics: [[3], [4]]},
{ _id: '4567', characteristics: [[5], [6]]},
{ _id: '4567',characteristics: [ [7], [8]]},
{ _id: '4987',characteristics: [ [9], [10]]}];
var o = {}
var result = data.reduce(function(r, e) {
if (!o[e._id]) {
o[e._id] = e;
r.push(o[e._id]);
} else {
o[e._id].characteristics.push(...e.characteristics);
}
return r;
}, [])
console.log(result)
答案 1 :(得分:1)
使用Array.prototype.reduce
和哈希表对属性进行分组 - 请参阅下面的演示:
var array=[{_id:'1234',characteristics:[[1],[2]]},{_id:'1234',characteristics:[[3],[4]]},{_id:'4567',characteristics:[[5],[6]]},{_id:'4567',characteristics:[[7],[8]]},{_id:'4987',characteristics:[[9],[10]]}];
var result = array.reduce(function(hash) {
return function(prev,curr){
if(hash[curr._id]) {
curr.characteristics.forEach(function(e){
hash[curr._id].push(e);
});
} else {
hash[curr._id] = curr.characteristics;
prev.push({_id: curr._id, characteristics:hash[curr._id]})
}
return prev;
};
}(Object.create(null)), []);
console.log(result);

.as-console-wrapper{top:0;max-height:100%!important;}

答案 2 :(得分:0)
可以使用.reduce()
完成此操作。不需要辅助对象。
var data = [{ _id: '1234', characteristics: [[1], [2]]},
{ _id: '1234',characteristics: [[3], [4]]},
{ _id: '4567', characteristics: [[5], [6]]},
{ _id: '4567',characteristics: [ [7], [8]]},
{ _id: '4987',characteristics: [ [9], [10]]}];
var found = false;
var result = data.reduce(function(prev, curr) {
prev.forEach(function(obj) {
if (obj._id == curr._id) {
obj.characteristics = obj.characteristics.concat(curr.characteristics);
found = true;
}
});
if (!found)
prev.push(curr);
found = false;
return prev;
}, []);
console.log(result)
答案 3 :(得分:0)
使用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);
使用ES6:
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);
答案 4 :(得分:0)
您可以执行以下操作;
var data = [{ _id: '1234', characteristics: [["whatever"], ["whatever"]]},
{ _id: '1234', characteristics: [["whatever"], ["whatever"]]},
{ _id: '4567', characteristics: [["whatever"], ["whatever"]]},
{ _id: '4567', characteristics: [["whatever"], ["whatever"]]},
{ _id: '4987', characteristics: [["whatever"], ["whatever"]]}],
lut = data.reduce((p,c) => p[c._id] ? (p[c._id].characteristics.push(...c.characteristics),p)
: (p[c._id] = c, p), {});
result = Object.keys(lut)
.map(k => lut[k]);
console.log(result);
&#13;