我有两个带有一些共同字段的Json数组。但它们没有按任何特定顺序排序。我希望能够根据属性合并它们。
var merge = require('deepmerge');
var one = [{
id:1
},
{
id:2
}];
var two = [{
id:2,
name:"test1"
},
{
id:1,
name:"test2"
}];
console.log(merge(one,two));
deepmerge导致盲合并,第一个元素与另一个数组的第一个元素。
[ { id: 2, name: 'test1' }, { id: 1, name: 'test2' } ]
我知道可以通过一个数组手动迭代,从另一个数组中找到匹配的节点并合并它们......想知道是否有任何库来执行此操作。想法?
答案 0 :(得分:2)
您可以使用一个函数并定义公共密钥,合并应该在该公共密钥上进行分组。它适用于未分类的数据。
function merge(array, key) {
var r = [],
hash = Object.create(null);
array.forEach(function (a) {
a.forEach(function (o) {
if (!hash[o[key]]) {
hash[o[key]] = {};
r.push(hash[o[key]]);
}
Object.keys(o).forEach(function (k) {
hash[o[key]][k] = o[k];
});
});
});
return r;
}
var one = [{ id: 1, score: 100 }, { id: 2, score: 200 }, { id: 4, score: 400 }],
two = [{ id: 2, name: "test1" }, { id: 1, name: "test2" }, { id: 3, name: "test3" }],
merged = merge([one, two], 'id');
console.log(merged);

答案 1 :(得分:0)
预先对两个数组进行排序?
one.sort((a, b) => a.id - b.id);
two.sort((a, b) => a.id - b.id);
现在数组已经排序,您应该能够正确合并它们:
console.log(merge(one, two));
答案 2 :(得分:0)
我认为你在lodash中寻找merge。后续来源会覆盖以前来源的属性分配。所以这将覆盖后续的id
var users = {
'data': [{ 'user': 'barney' }, { 'user': 'fred' }]
};
var ages = {
'data': [{ 'age': 36 }, { 'age': 40 }]
};
_.merge(users, ages);
// → { 'data': [{ 'user': 'barney', 'age': 36 }, { 'user': 'fred', 'age': 40 }] }