通过公共对象键合并多个对象数组
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()
我有一个问题,我希望你好心 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()