通过公共对象键合并多个对象数组

Merge multiple arrays of objects by common object key

我有一个问题,我希望你好心 JavaScript Stack Overflow 上的人可以帮助我解决这个问题。

给定以下数组:

var array1 = [{address: "www.example.com", hits: 1}, {address: "www.anotherone.org", hits: 10}]
var array2 = [{address: "www.example.com", buttons: 1}, {address: "www.yetanotherone.info", buttons: 2}]
var array3 = [{address: "www.example.com", cons: 1}, {address: "andevenonemore.com", cons: 1}]

我想通过地址键合并这些数组,这在所有数组中都是通用的,但值可能不同。如果地址值不在数组中,则它应默认为 0。 因此,结果数组应如下所示:

var resultArray = [{
  address: "www.example.com",
  hits: 1,
  buttons: 1,
  cons: 1
}, {
  address: "www.anotherone.org",
  hits: 1,
  buttons: 0,
  cons: 0
}, {
  address: "www.yetanotherone.info",
  hits: 0,
  buttons: 2,
  cons: 0
}, {
  address: "andevenonemore.com",
  hits: 0,
  buttons: 0,
  cons: 1
}]

合并将在服务器上进行,我可以使用 Underscore.js。

我真的希望,比我聪明得多的人能给我一个有效的方法来解决这个问题。非常感谢您的帮助!

在简单的 Javascript 中,您可以使用散列 table 来引用单个地址项并计算您需要的值。

var array1 = [{ address: "www.example.com", hits: 1 }, { address: "www.anotherone.org", hits: 10 }],
    array2 = [{ address: "www.example.com", buttons: 1 }, { address: "www.yetanotherone.info", buttons: 2 }],
    array3 = [{ address: "www.example.com", cons: 1 }, { address: "andevenonemore.com", cons: 1 }],
    grouped = [];

[].concat(array1, array2, array3).forEach(function (a) {
    if (!this[a.address]) {
        this[a.address] = { address: a.address, hits: 0, buttons: 0, cons: 0 };
        grouped.push(this[a.address]);
    }
    Object.keys(a).forEach(function (k) {
        if (k !== 'address') {
            this[a.address][k] += a[k];
        }
    }, this);

}, Object.create(null));

console.log(grouped);

我知道已经有一个可接受的答案,但这里有一个使用下划线的答案。它首先按地址分组,然后用组中的每个对象扩展起始对象。

var data = [].concat(array1, array2, array3);

var extendArray = function(arr){
   return _.reduce(arr, (memo,val) => _.extend(memo, val), {hits: 0, buttons: 0, cons: 0});
}

var resultArray = _.chain(data)
   .groupBy('address')
   .map(extendArray)
   .value()