我有一个看起来像这样的记录数据集:
[{
"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/