在添加其他元素的同时,浏览嵌套数组并删除重复项

时间:2015-11-27 17:38:01

标签: javascript arrays

所以这就是我想要做的事情。

我有一个数组,其中包含更多日期数组(有多个日期)和个别分数。它看起来像这样:

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中执行此操作,而不使用任何库。

3 个答案:

答案 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);
}

JSFiddle