在数组中添加对象的所有匹配值(Javascript)(Angular)

时间:2018-01-09 21:18:23

标签: javascript angular typescript firebase google-cloud-firestore

我正在使用

  • Angular 5
  • AngularFire5
  • Firebase&公司的FireStore

我正在努力实现

我试图遍历数组中的所有项目,这些项目包含对象。如果对象中的某个值与另一个对象中的相同值匹配,则它将一起添加另一个值。

示例:

开始于:

mapData = [{"countryCode":"US", "clicks": 5}, {"countryCode":"CAN", "clicks": 9}, {"countryCode":"US", "clicks": 6}]

mapData = [["US", 5], ["CAN", 9], ["US", 6]]

结束于:

mapDataResults = {
    "US": {
        "usage": 11,
        "fillKey": "tens"
    },
    "CAN": {
        "usage": 9,
        "fillKey": "ones"
    },
}

我被困的地方

我不知道如何搜索和匹配数组中的不同对象值。另外,我需要弄清楚如何重新组织数据的返回方式,而不是需要采用JSON格式的数组。最后,我想我可能能够自己解决这个问题,如果我可以获得其他部分的帮助,但是根据点击次数(或)增加“fillKey”的附加值用法)。

2 个答案:

答案 0 :(得分:1)

假设您的第一个集合是一个数组数组:

let entries = [["US", 5], ["CAN", 9],["US", 6]];

function getMostSigDigitName(number) {
    switch(Math.floor(number).toString().length) {
        case 1: return 'ones';
        case 2: return 'tens';
    }
}

function consolidateAndEmit(a) {
    let result = {};
    for(let i=0;i<a.length;i++) {
        let key = a[i][0];
        let val = a[i][1];
        if(result[key]) {//exists, so update
            result[key].usage += val;
        }
        else {//does not exist, so add 
            result[key] = { usage: val};
        }
        result[key].fillKey = getMostSigDigitName(result[key].usage);
    }
    return result;
}

consolidateAndEmit(entries);

答案 1 :(得分:0)

如果您可以使用lodash,这可能是一个不错的选择:

mapData = [{"US", 5}, {"CAN", 9},{"US", 6}];

然后_.sumBy(mapData, 'US')_.sumBy(mapData, "CAN")

您需要做的就是将响应映射到对象。我已经给出了流量来获得总和,如果mapData数组有额外的数据包含“US”或“CAN”,它就会被添加。