所以这就是我想要做的事情。
我有一个数组,其中包含更多日期数组(有多个日期)和个别分数。它看起来像这样:
var example = [
["11/7/2015", 4],
["11/7/2015", 7],
["11/7/2015", 2],
["11/8/2015", 2],
["11/8/2015", 7],
["11/9/2015", 0],
["11/10/2015", 1]
];
我的目标是遍历整个数组(它有大约900个单元格),可以添加/组合相似日期的分数,并整体删除所有重复日期,并将分数加在一起。
所以第一个数组的最终结果应如下所示:
var example = [
["11/7/2015", 13],
["11/8/2015", 9],
["11/9/2015", 0],
["11/10/2015", 1]
];
如您所见,删除了重复日期,并在一个单元格下添加了每个重复单元格的分数。
我尝试使用像这样的for循环(使用数组的副本,因此我可以将它用作与原始数据的比较):
for(var i = 1; i < example.length; i--){
if(example[i][0] === dummyArray[i-1][0]){
example[i-1][1] += dummyArray[i][1];
example.splice(i,1);
} else{
}
}
但我不能在循环中使用i-1
语法,也不确定从何处开始。我的目标是在纯JavaScript中执行此操作,而不使用任何库。
答案 0 :(得分:3)
这是一种方法:
var dateScoreAggregateMap = {};
example.forEach(function(pair){
if(dateScoreAggregateMap[pair[0]]){
dateScoreAggregateMap[pair[0]] += pair[1];
} else {
dateScoreAggregateMap[pair[0]] = pair[1];
}
});
example = Object.keys(dateScoreAggregateMap).map(function(date){
return [date, dateScoreAggregateMap[key]];
});
答案 1 :(得分:2)
如果你不介意对象形式的结果:
var example = [
["11/7/2015", 4],
["11/7/2015", 7],
["11/7/2015", 2],
["11/8/2015", 2],
["11/8/2015", 7],
["11/9/2015", 0],
["11/10/2015", 1]
];
var out = example.reduce(function (p, c) {
if (!p[c[0]]) p[c[0]] = 0; // key doesn't exist in object, add it and set it to zero
p[c[0]] += c[1]; // add the score to the existing key
return p;
}, {});
alert(JSON.stringify(out));
答案 2 :(得分:1)
首先生成结果通过对象:
var obj = {};
example.map(function(el) {
el[0] in obj ? obj[el[0]] += el[1] : obj[el[0]] = el[1];
return obj;
});
el
是数组对。您询问日期el[0]
是否在对象中。如果是,请添加对应的值。如果没有,请使用相应的值设置密钥。
将对象翻译到数组:
var arr = Object.keys(obj).map(function(el) {
return [el, obj[el]];
});
或(相等):
var arr = [];
for(k in obj) {
var pair = [k, obj[k]];
arr.push(pair);
}