【问题标题】:Merge 2 json array objects based on a common property基于公共属性合并 2 个 json 数组对象
【发布时间】:2016-10-29 10:08:12
【问题描述】:

我得到了 2 个带有一些公共字段的 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' } ]

我知道可以手动迭代一个数组,从另一个数组中找到匹配的节点并将它们合并...想知道是否有任何库可以做到这一点。想法?

【问题讨论】:

  • 是的,一切皆有可能,但您到底想要什么?
  • @nina 我得到了 2 个未排序的数组,但至少有一个我上面提到的公共属性,并且想要合并它们。这有帮助吗?
  • 不是真的,请添加更多示例。以及想要的合并结果。
  • 想要一个合并数组作为结果,例如 [ { id: 1, name: 'test2' }, { id: 2, name: 'test1' }, { id: 3, name: ' test3' } ]
  • 我看不出有什么要合并的,只取两个作为结果。

标签: javascript arrays json node.js


【解决方案1】:

您可以使用一个函数并定义合并应该分组的公共键。它适用于未排序的数据。

function merge(arrays, key) {
    var r = [],
        hash = Object.create(null);

    arrays.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);

【讨论】:

    【解决方案2】:

    我想你在 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 }] }
    

    【讨论】:

      【解决方案3】:

      事先对两个数组进行排序?

      one.sort((a, b) => a.id - b.id);
      two.sort((a, b) => a.id - b.id);
      

      现在数组已排序,您应该能够正确合并它们:

      console.log(merge(one, two));
      

      【讨论】:

      • 谢谢..我确实试过这个..当我在第一个数组中有一个在第二个数组中没有任何匹配的数组元素时它不起作用。下面是一个示例排序数组 - 一个 [ { id: 1 }, { id: 2 }, { id: 4 } ] 排序数组 - 两个 [ { id: 1, name: 'test2' }, { id: 2, name : 'test1' }, { id: 3, name: 'test3' } ] 合并数组 [ { id: 1, name: 'test2' }, { id: 2, name: 'test1' }, { id: 3,名称:'test3'}]
      猜你喜欢
      • 1970-01-01
      • 2019-06-11
      • 2023-02-13
      • 2017-06-02
      • 1970-01-01
      • 1970-01-01
      • 2021-03-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多