基于common id连接两个js对象数组的功能方法

时间:2014-05-11 10:15:49

标签: javascript functional-programming underscore.js

我试图实现类似于SQL表连接的东西, 以最优雅(功能)的方式,最好使用underscore.js, 所以没有for循环请。

我需要合并来自两个不同数组的对象,并在公共标识符上进行匹配。

例如,给定:

var basic = [{
              id: '1',
              name: 'someName',
             }, 
             {...} ]

var ext= [{
              id: '1',
              job: 'someJob',
             }, 
             {...} ]

结果应为:

var combined = [{
                 id: '1',
                 name: 'someName',
                 job: 'someJob',
                }, 
                {...} ]

谢谢!

2 个答案:

答案 0 :(得分:3)

Map,findWhere和extend应该可以解决问题:

var combined = _.map(basic, function(base){
    return _.extend(base, _.findWhere(ext, { id: base.id} ));
});

修改

如果性能有问题,请创建扩展值的哈希值:

var extHash = _.reduce(ext, function(memo, extended, key){
    memo[extended.id] = extended;
    return memo;
}, {});

并使用如下:

var combined = _.map(basic, function(base){
    return _.extend(base, extHash[base.id]);
});

Fiddle

答案 1 :(得分:0)

NO LOOP: http://jsfiddle.net/abdennour/h3hQt/2/

   basic=basic.sort(function(a,b){return a.id-b.id});
    ext=ext.sort(function(a,b){return a.id-b.id});
    var combined=basic.map(function(e,i){return inherits(e,ext[i]) });

已知inherits如下:

function inherits(base, extension)
{
   for ( var property in base )
   { 
         extension[property] = base[property];
   }
    return extension ;
}