合并多维数组中的重复数组键

时间:2013-09-13 21:49:59

标签: javascript arrays multidimensional-array duplicates

所以我希望我的2D数组具有重复值(如下所示),以合并电子邮件地址相同的位置。电子邮件总是处于相同的位置。

[['john.doe@example.com', 64], ['john.doe@example.com', 65], ['jane.doe@example.com', 66]]

我希望我能得到一个结果:

[['john.doe@example.com', 64, 65], ['jane.doe@example.com', 66]]

我不认为阵列会有很多值,所以如果答案不是疯狂有效的话,那不是交易破坏者。

修改

这是我尝试过的,它对我有用。

有人早些时候发布了这个答案,我真的很喜欢它,但后来它被删除了。所以我要发布它,看看其他人的想法。我没有道具!

var a = [['john.doe@example.com', 64], ['john.doe@example.com', 65], ['jane.doe@example.com', 66]];
var map = {};
for(var i=0; i<a.length; i++) {
    if(a[i][0] in map) {
        map[a[i][0]].push(a[i][1]);
    } else {
        map[a[i][0]] = [a[i][1]];
    }
}
console.log(map);

第一部分实际删除重复项并转换为数组中包含数字的对象。

a.length = 0;
for(var p in map) {
   a.push([p].concat(map[p]));   
}
console.log(a);

这第二部分是可选的。它将对象转换回数组。

不确定是谁发布了这个,但我喜欢这样做的方式。

2 个答案:

答案 0 :(得分:1)

我的意见:

var list = [['john.doe@example.com', 64], ['john.doe@example.com', 65], ['jane.doe@example.com', 66]],
    output = [],
    helper = [],
    index;

for(var i = 0; i < list.length; i++) {
 index = helper.indexOf(list[i][0];
 if(index !== -1) {
  output[index].push(list[i][1]);
 } else {
  helper.push(list[i][0]);
  output.push(list[i]);
 }
}
console.log(output);

答案 1 :(得分:0)

这是一种快速的方法:

function getIndex(a, email) {
    for (var i = 0; i < a.length; i++) {
        if (a[i][0] === email) {
            return i;
        }
    }
    return -1;
}

var a = [['john.doe@example.com', 64], ['john.doe@example.com', 65], ['jane.doe@example.com', 66]];

var b = []

for (var i = 0; i < a.length; i++) {
    var index = getIndex(b, a[i][0]);       
    if(index == -1){
        b.push(a[i]);
    }else{
        b[index].push(a[i][1]);
    }
};

console.log(b);