javascript - 从一个数组中按组获取 Sum 并将总和更新到同一组名称的另一个数组

标签 javascript jquery

我有两个数组

levelOne = [
  {Code: "A", Count: 0, Date: 2017-04-01,....},
  {Code: "A", Count: 0, Date: 2017-05-01,....},
  {Code: "B", Count: 0, Date: 2017-04-01,....},
  {Code: "B", Count: 0, Date: 2017-05-01,....}
];    
levelTwo = [
  {Code: "A", Count: 10, Date: 2017-04-01,....},
  {Code: "A", Count: 12, Date: 2017-05-01,....},
  {Code: "B", Count: 50, Date: 2017-04-01,....},
  {Code: "B", Count: 18, Date: 2017-05-01,....},
  {Code: "A", Count: 20, Date: 2017-05-01,....},
  {Code: "B", Count: 60, Date: 2017-04-01,....},
  {Code: "B", Count: 77, Date: 2017-05-01,....}
];

我想用相同代码和日期的 levelTwo 数组中的计数总和来更新 levelOne 数组的计数。

到目前为止我做了什么?

我在 levelOne 上放置了一个 $.each 循环,但我被卡住了。

    $.each( levelOne , function( index, value ){
                  //I'm stuck
        $.each( levelTwo , function( idx, val ){
             if(value.Code==val.Code && value.Date == val.Date){
                  //I'm stuck
             }
                  //I'm stuck                
        });
    });

有什么建议吗?有更好的方法来实现吗?

最佳答案

您可以使用哈希表的相当前向的方法,首先迭代目标数组,然后迭代源数组进行计数。

通过迭代 levelOne,哈希表将填充代码和日期值作为键,对象本身作为值。

迭代levelTwo将实际的Count添加到结果数组中。

var levelOne = [{ Code: "A", Count: 0, Date: '2017-04-01' }, { Code: "A", Count: 0, Date: '2017-05-01' }, { Code: "B", Count: 0, Date: '2017-04-01' }, { Code: "B", Count: 0, Date: '2017-05-01' }],
    levelTwo = [{ Code: "A", Count: 10, Date: '2017-04-01' }, { Code: "A", Count: 12, Date: '2017-05-01' }, { Code: "B", Count: 50, Date: '2017-04-01' }, { Code: "B", Count: 18, Date: '2017-05-01' }, { Code: "A", Count: 20, Date: '2017-05-01' }, { Code: "B", Count: 60, Date: '2017-04-01' }, { Code: "B", Count: 77, Date: '2017-05-01' }],
    getKey = function (o) { return ['Code', 'Date'].map(function (k) { return o[k]; }).join('|'); },
    hash = Object.create(null);

levelOne.forEach(function (o) { hash[getKey(o)] = o; });
levelTwo.forEach(function (o) { hash[getKey(o)].Count += o.Count; });
   
console.log(levelOne);
.as-console-wrapper { max-height: 100% !important; top: 0; }

ES6 带有 Map

var levelOne = [{ Code: "A", Count: 0, Date: '2017-04-01' }, { Code: "A", Count: 0, Date: '2017-05-01' }, { Code: "B", Count: 0, Date: '2017-04-01' }, { Code: "B", Count: 0, Date: '2017-05-01' }],
    levelTwo = [{ Code: "A", Count: 10, Date: '2017-04-01' }, { Code: "A", Count: 12, Date: '2017-05-01' }, { Code: "B", Count: 50, Date: '2017-04-01' }, { Code: "B", Count: 18, Date: '2017-05-01' }, { Code: "A", Count: 20, Date: '2017-05-01' }, { Code: "B", Count: 60, Date: '2017-04-01' }, { Code: "B", Count: 77, Date: '2017-05-01' }],
    hash = new Map,
    getKey = o => ['Code', 'Date'].map(k => o[k]).join('|');

levelOne.forEach(o => hash.set(getKey(o), o));
levelTwo.forEach(o => hash.get(getKey(o)).Count += o.Count);
   
console.log(levelOne);
.as-console-wrapper { max-height: 100% !important; top: 0; }

关于javascript - 从一个数组中按组获取 Sum 并将总和更新到同一组名称的另一个数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45350058/

相关文章:

javascript - 使用 javascript 的替换函数时出现字符串语法错误

javascript - jQuery:如何从多个元素获取文本并将其打印在多行上?

javascript - 向除元素之外的主体添加覆盖层

javascript - 推文按钮 JavaScript

javascript - Sequelize : TypeError: Cannot read property 'length' of undefined when try to create data on DB

javascript - 带有 Jasmine 模拟困境的angularjs单元测试业力

javascript - 使用 jquery 获取子字符串

javascript - 如何禁用浏览器的后退和前退按钮?

jquery - 垂直站点上的多个全屏背景图像

javascript - 超时后如何将按钮恢复到原始状态