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

时间:2016-07-19 07:05:40

标签: javascript arrays underscore.js

我遇到了一个问题,我希望您在Stack Overflow上的JavaScript人员可以帮助我解决这个问题。

给出以下数组:

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。

我真的希望,比我聪明的人可以给我一个有效的方法来解决这个问题。真的很感谢你的帮助!

2 个答案:

答案 0 :(得分:1)

在普通的Javascript中,您可以使用哈希表来引用单个地址项并计算所需的值。

function zooms(zoomType) {  
    switch(zoomType) {
        case '+':
            newW += 10;
            break;
        case '-':
            newW -= 10;
            break
    }

    if(newW <= 0) {
        newW = 0;
    } else {
        if(newW >= 100) {
            newW = 100;
        }
    }
    return newW;
}

function backgroundAdjust(num, el) {        
    wid = (parseInt(num)+parseInt(el.width()));
    el.css({
        'background-size': wid + 'px auto'
    });
    return;
}

$('input.zoomButton').click(function() {
    zoomType = $(this).val();
    zoomNum = zooms(zoomType);
    backgroundAdjust(zoomNum, $('#uploadImage'));
});

答案 1 :(得分:1)

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

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()
相关问题