【问题标题】:Merge JSON arrays by matching property in Nodejs通过在 Nodejs 中匹配属性来合并 JSON 数组
【发布时间】:2016-10-04 05:08:45
【问题描述】:

我在 Node.js 中有两个 JSON 数组。

var a = [{id: 1, name: 'A'}, {id: 2, name: 'B'}, {id: 3, name: 'C'}, {id: 4, name: 'D'}];

var b = [{id: 1, marks: 80}, {id: 2, marks: 30}, {id: 3, marks: 76}];

我想合并这些数组,匹配id 值。请提出一种有效的方法来执行此操作,因为数组包含大约 25000 记录。

期望的输出:

var o = [{id: 1, name: 'A', marks: 80}, {id: 2, name: 'B', marks: 30}, {id: 3, name: 'C', marks: 76}, {id: 4, name: 'D'}];

谢谢。

【问题讨论】:

标签: arrays json node.js underscore.js


【解决方案1】:

你应该创建一个索引对象

const indexB = b.reduce( ( result, item ) => { 
    result[item.id] = item; 
    return result; 
}, {});

var mergedArr = a.map( item => Object.assign( item, indexB[item.id] ) );

在我的基准测试中,下划线方法和我的方法有很大的不同:

λ ~/Projects/_tests/performance ◆ time node a.js
node a.js  44.36s user 0.38s system 98% cpu 45.216 total
λ ~/Projects/_tests/performance ◆ time node b.js
node b.js  0.10s user 0.02s system 95% cpu 0.118 total

a.js 带有下划线的地方。

【讨论】:

  • 如果你使用Object.assign (ES6),你应该使用Map而不是一个对象作为索引?
【解决方案2】:

使用下划线,你可以这样做:

var mergedArr = _.map(v1, function(item){
    return _.extend(item, _.findWhere(v2, { id: item.id }));
});

【讨论】:

    【解决方案3】:

    或者是这样的:

    a.map(function (aObj) {
      aObj.marks = (b.filter(function (bObj) {
        return bObj.id === aObj.id;
      }).shift() || {
        marks: null
      }).marks;
    });
    
    console.log(a);
    
    // output: 
    [ { id: 1, name: 'A', marks: 80 },
      { id: 2, name: 'B', marks: 30 },
      { id: 3, name: 'C', marks: 76 },
      { id: 4, name: 'D', marks: null } ]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-11
      • 1970-01-01
      • 1970-01-01
      • 2019-10-21
      • 1970-01-01
      • 2023-03-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多