javascript - 如何使用javascript循环遍历键,值并在另一个键匹配时将一个键的值相加

标签 javascript jquery

我有一个看起来像这样的记录数据集:

[{
 "d1d":"2015-05-28T00:00:00.000Z",
 "d1h":0,
 "d15m":0,
 "ct":3
},
{
 "d1d":"2015-05-28T00:00:00.000Z",
 "d1h":0,
 "d15m":0,
 "ct":1
}
]

每条记录的ct值都会变化。如果一个或多个记录中的 d1d、d1h 和 d15m 相同,我需要将这些记录与所有 ct 值的总和合并为一个。

我有 jquery,我可以为此使用 grep 吗?

我意识到服务器端可以更好地获取这些数据,但我对此的控制为零。

最佳答案

您不必为此使用 jQuery,原生 JavaScript 即可。 我将向您展示解决问题的两种方法;

示例 1:滥用 Array#reduce作为迭代器

var intermediaryArray = [];
dataset.reduce(function(prev, curr) {
  if(prev.d1d === curr.d1d && prev.d1h === curr.d1h && prev.d15m === curr.d15m) {
    intermediaryArray.push({
      d1d: prev.d1d,
      d1h: prev.d1h,
      d15m: prev.d15m,
      ct: prev.ct + curr.ct
    });
  } else {
    // push the one that wasn't the same
    intermediaryArray.push(curr);
  }
  // return current element so reduce has something to work on
  // for the next iteration.
  return curr;
});

示例 2:使用 Array#Map和 Array#Reduce 结合

这个例子利用了underscore.js展示你想做的事情背后的逻辑。

.map() 生成新的分组对象数组。 .groupBy() 生成一个子数组数组,其中包含传递所有对象必须共享相同 d1d 或分组函数的谓词的对象。 .reduce() 将所有子数组归结为一个值,您的对象与两个 ct 相加。

var merged = _.map(_.groupBy(a, 'd1d'), function(subGroup) {
  return subGroup.reduce(function(prev, curr) {
    return {
      d1d: prev.d1d,
      d1h: prev.d1h,
      d15m: prev.d15m,
      ct: prev.ct + curr.ct
    };
  });
});

关于javascript - 如何使用javascript循环遍历键,值并在另一个键匹配时将一个键的值相加,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30519963/

相关文章:

javascript - Capybara 无法识别动态添加的 DOM 元素?

javascript - 更改多个 iframe 中的文本框属性

javascript - 向 innerHTML 添加淡入/淡出效果

jquery - 使用 $.post 发布数据失败并显示空数据

jquery - 我有带下拉菜单的 CSS 菜单,但是我的下拉菜单被我的 jquery 幻灯片阻止了,有什么办法可以修复它?

javascript - 如何将数据从ajax javascript传递到MVC Controller ?

javascript - 将数据从 socket.io 中间件传递到事件的正确方法

javascript - Angular 4 : How to bind to function result in ngFor

javascript - 不切换到 IE 或 Firefox 中的窗口

javascript - 如何在 jquery css 中动画地向下滚动|向上滚动?