2

所以我有数组A:

   var arrA = [{
      name: 'twitter',
      location: 0,
      hidden: false,
      href: "https://twitter.com/i/connect"
    }, {
      name: 'medium',
      location: 1,
      hidden: false,
      href: "https://medium.com/me/activity"
    }
  ];

和数组 B:

var arrB = [{
      name: 'twitter',
      location: 1,
      hidden: false
    }, {
      name: 'medium',
      location: 0,
      hidden: false
    }
  ];

我怎样才能得到一个看起来像这样的数组:

var newArr = [{
      name: 'twitter',
      location: 1,
      hidden: false,
      href: "https://twitter.com/i/connect"
    }, {
      name: 'medium',
      location: 0,
      hidden: false,
      href: "https://medium.com/me/activity"
    }
  ];

所以,这里location有两件事,1. 值取自arrB,而不是arrA2.newArr对象现在包含href键,取自arrA

所以我需要第二个数组中的值,但新键是从第一个数组中维护的。

我可以使用 underscore.js 函数来执行此操作吗(我现在正在使用 _.extend,但如果它是新的,它不会保留密钥arrA)?

4

4 回答 4

1

您可以连接两个数组并使用Alasql库选择适当的属性:

var res1 = alasql('SELECT arrA.name, arrB.location, arrA.href, arrB.hidden \
            FROM ? arrA JOIN ? arrB USING name', [arrA,arrB]);

或下划线 _.extend 版本:

alasql.fn.extend = _.extend.bind(_);
var res2 = alasql('SELECT COLUMN extend(arrA._, arrB._) 
                   FROM ? arrA JOIN ? arrB USING name', [arrA,arrB]);

在 jsFiddle尝试这些示例。

于 2014-12-23T10:14:52.120 回答
0
var newArr=[];
$.each(arrA, function(index, value) {
$.extend(value, arrB[index]);
newArr[index]=value
});

http://jsfiddle.net/QZzZM/

于 2013-05-30T06:13:44.833 回答
0

不确定下划线是否具有合并这样的数组的功能,但是您可以编写如下所示的函数来有条件地合并数组

Array.prototype.conditionalMerge = function(arr, props){

    var merged = [];

    for(var i=0; i<this.length;i++){
        var item = {};
        for(var attr in this[i]){
            item[attr] = (props[attr])?arr[i][attr]:this[i][attr];
        }
        merged.push(item);
    }

    return  merged;
}

arrA.conditionalMerge(arrB, {location:true})
于 2013-05-30T06:57:56.317 回答
0

您可以将条目“映射”arrA到它们自己与arrB. 在下划线中:

_.map(arrA, function(a) {
    return _.extend(a, _.find(arrB, function(b) {
        return a.name === b.name;
    }));
});

该解决方案具有以下特点:

  1. 对象可以在两个数组中以任意顺序出现;它们按名称匹配。
  2. 数组 b 中对象中的任何额外属性都将被复制。

在原生 JS

arrA.map(function(a) {
    return Object.assign(a, arrB.find(function(b) {
        return a.name === b.name; 
    }));
});

Object.assignArray.find,如果不可用,可以填充。例如,这是一个版本find

Array.prototype.find = function(callback) {
    for (var i = 0; i < this.length; i++ ) {
        if (callback(this[i], i, this)) return this[i];
    }
 });
于 2014-12-23T10:25:50.913 回答