根据公共属性合并2个json数组对象

时间:2016-06-27 11:48:59

标签: javascript arrays json node.js

我有两个带有一些共同字段的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' } ]

我知道可以通过一个数组手动迭代,从另一个数组中找到匹配的节点并合并它们......想知道是否有任何库来执行此操作。想法?

3 个答案:

答案 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 }] }