如何在JavaScript多维数组中查找重复项

时间:2014-01-08 13:30:48

标签: javascript jquery multidimensional-array

我有一个数组如下

var myArry = [[1,2], [1,1], [2,0], [1,2], [1,1]]

在这个数组中,我希望找到重复的重复项[1,1], [1,2]。那么如何在jquery / javascript中执行此操作。

4 个答案:

答案 0 :(得分:3)

基本上,您迭代项目并将每个项目推送到新阵列(如果没有它)。问题是如何比较不同的项目,因为像这样的对象比较会产生错误:

[1,2] === [1,2]
// or this
[1,2] == [1,2]

其中一种方法是将数据转换为可比较的格式,执行迭代,然后将所有内容转换回来:

var data = [[1,2], [1,1], [2,0], [1,2], [1,1]];

var noDupes = data
.map(function (item) {
  return JSON.stringify(item);
})
.reduce(function (out, current) { 
  if (out.indexOf(current) === -1) out.push(current);
  return out;
}, [])
.map(function (item) {
  return JSON.parse(item);
});

console.log(data, noDupes);

// [[1, 2], [1, 1], [2, 0], [1, 2], [1, 1]]
// [[1, 2], [1, 1], [2, 0]]

显然,通过这种方法,您将失去项目参考。要保留它们,请使用:

var data = [[1,2], [1,1], [2,0], [1,2], [1,1]];

var dataUnique = data.reduce(function (out, item) {
  return out.concat(out.filter(function (comp) {
    return item.toString() == comp.toString();
  }).length ? [] : [item])
}, []);

console.log(data, dataUnique);

// [[1,2], [1,1], [2,0], [1,2], [1,1]]
// [[1,2], [1,1], [2,0]]

但只有当item不包含任何对象时才有效。

更新(2016年6月26日):

这是ES2015版本:

const uniquePairs = pairs => [...new Set(pairs.map(pair => JSON.stringify(pair)))].map(pair => JSON.parse(pair))

uniquePairs([[1,2], [1,1], [2,0], [1,2], [1,1]])
// [[1,2],[1,1],[2,0]]

分步说明:

  1. 将对转换为可比较的字符串。请注意此处使用的arrow function

    pairs.map(对 => JSON.stringify(pair)))

  2. 使用Set的实例仅获取唯一字符串:

    新设置(pairs.map(pair => JSON.stringify(pair)))

  3. 通过spread operator转换为数组:

    [... new Set(pairs.map(pair => JSON.stringify(pair)))]

  4. 将其转换回初始对数组结构:

    [... new Set(pairs.map(pair => JSON.stringify(pair)))] .map(pair => JSON.parse(pair))

  5. 如果您担心浏览器ES2015支持,请使用Babel或类似工具将其细分为ES5。

答案 1 :(得分:2)

试试这个:

function arraysEqual(arr1, arr2) {
    if(arr1.length !== arr2.length)
        return false;
    for(var i = arr1.length; i--;) {
        if(arr1[i] !== arr2[i])
            return false;
    }

    return true;
}

var duplicate = [];
$.each(myArry, function( index, value ) {
     $.each(myArry, function( index2, value2 ) {
          if(arraysEqual(value,value2))
               duplicate.push(value);
     });
});

答案 2 :(得分:1)

循环遍历数组,将第一个和第二个值与每个后续数组条目进行比较。

如果匹配,则将匹配的1份副本存储在新数组中,并在循环后将其作为结果返回。

很抱歉没有代码,但这是不言自明的。

答案 3 :(得分:1)

var myArray = [[1,2], [1,1], [2,0], [1,2], [1,1]], result = [];
var frequency = myArray.reduce(function(seen, currentItem) {
    if (currentItem in seen) {
        seen[currentItem] = seen[currentItem] + 1;
    } else {
        seen[currentItem] = 1;
    }
    return seen;
}, {});

for (var key in frequency) {
    if (frequency[key] > 1) {
        result.push(key.split(",").map(function(currentItem) {
            return parseInt(currentItem);
        }));
    }
}

console.log(result);

<强>输出

[ [ 1, 2 ], [ 1, 1 ] ]