[英]How to use javascript to loop through key , values and add up one key's value when the other's match
我有一个记录数据集,如下所示:
[{
"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,vanilla JavaScript也可以。 我会告诉你两个问题的解决方案;
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;
});
此示例使用underscore.js来演示您想要执行的操作背后的逻辑。
.map()
生成新的分组对象数组。 .groupBy()
生成一个子数组数组,其中包含传递谓词的对象,所有对象必须共享相同的d1d
或分组函数。 .reduce()
所有子数组.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
};
});
});
这是一个可能的解决方案:
var dataset = [{
"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
}
]
function addCt(dataset) {
var ctMap = {}
var d1d, d1h, d15m, ct, key, value
for (var ii=0, record; record=dataset[ii]; ii++) {
key = record.d1d+"|"+record.d1h+"|"+record.d15m
value = ctMap[key]
if (!value) {
value = 0
}
value += record.ct
ctMap[key] = value
}
return ctMap
}
ctMap = addCt(dataset)
console.log(ctMap)
// { "2015-05-28T00:00:00.000Z|0|0": 4 }
您可能希望以不同的方式构造密钥。 您可能希望将值设置为包含d1d,d1h,d15m和累积ct值的对象,并为所有匹配的d1d,d1h和d15m值设置单个对象。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.