【问题标题】:Functional way of joining two js object arrays based on common id基于公共id连接两个js对象数组的功能方式
【发布时间】:2014-06-28 18:33:20
【问题描述】:

我正在尝试实现类似于 SQL 表连接的功能, 以最优雅(功能)的方式,最好使用 underscore.js, 所以请不要使用for循环。

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

例如,给定:

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

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

结果应该是:

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

谢谢!

【问题讨论】:

  • for 循环有什么问题?你认为递归是以函数方式处理数据结构的唯一方法吗?

标签: javascript functional-programming underscore.js


【解决方案1】:

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

【讨论】:

  • 我担心使用 findWhere 的性能
  • 你没有在问题中提到性能,而现在现代浏览器中的 js 处理已经高度优化。如果您确实有问题,那么您可以创建 ext 对象的哈希并在地图中使用它而不是 findWhere。
【解决方案2】:

没有循环: 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 ;
}

【讨论】:

  • mapWithIndex 和标准的.map()(或_.map)有什么区别?
猜你喜欢
  • 2017-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-24
  • 1970-01-01
  • 1970-01-01
  • 2020-07-13
  • 1970-01-01
相关资源
最近更新 更多