【问题标题】:Adding all matching values of objects in an array (Javascript) (Angular)在数组中添加对象的所有匹配值 (Javascript) (Angular)
【发布时间】:2018-06-18 23:54:22
【问题描述】:

我在用什么

  • 角 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 格式。最后,如果我能获得其他部分的帮助,我想我自己可能能够解决这个问题,但是要根据点击次数(或 用法)是。

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 那么,如果我要为世界上的每个国家/地区都这样做,我需要为所有 195 个国家/地区代码做一个或全部?
    • 您可以创建一个国家列表数组,然后在 sumBy 中映射。这样你就只有一行代码了。
    【解决方案2】:

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

    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);
    

    【讨论】:

    • 我只是想确保你明白我在问什么,我希望 mapData 看起来像 mapDataResults。我更新了问题以使其更有意义
    • mapData是数组数组还是对象数组?
    • 我刚刚更新了我的问题,使其更有意义。我意识到这没有意义
    • 所以这个函数将搜索所有的国家代码(美国、加拿大、ETC),如果有任何匹配,它将把这些数字加在一起,然后将这对添加到一个对象中?我只是想确保我了解正在发生的一切!
    • 是的,这将满足您的需求。
    猜你喜欢
    • 1970-01-01
    • 2020-08-23
    • 2015-12-11
    • 2020-09-14
    • 1970-01-01
    • 1970-01-01
    • 2019-07-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多