2014-01-08 30 views
2

我有一个数组如下如何找到重复在JavaScript多维数组

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

在这阵我想找到的复印件,其中[1,1], [1,2]重复。所以如何在jquery/javascript中做到这一点。

+3

jQuery不会帮你在这里。你尝试过什么,你搜索过了吗? – Bergi

+1

Neeeeeed more jQuery !!!!!!!!!!!! – crush

+2

Combine [在JavaScript数组中找到重复值的最简单方法](http://stackoverflow.com/questions/840781/easiest-way-to-find-duplicate-values-in-a-javascript-array)与[比较两个数组在Javascript](http://stackoverflow.com/questions/7837456/comparing-two-arrays-in-javascript) – Bergi

回答

1

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

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

对不起,没有代码,但这是不言自明的。

1

试试这个:

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); 
    }); 
}); 
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 ] ] 
2

基本上,你遍历项目和推动每一个进入新的数组,如果没有它。问题是如何比较不同的项目,因为对象比较喜欢这会产生错误:

[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]] 

但是,它仅适用于物品不包含任何物品的情况。

更新(2016年1月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(对)))

  2. 使用的Set一个实例只得到唯一的字符串:

    新套装

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

  3. 转换经由spread operator设置为阵列

    [...新设置(pairs.map(pair => JSON。字符串化(一对)))]

  4. 将其转换回初始对阵列结构:

    [...新集(pairs.map(对=> JSON.stringify(一对)))] .MAP(对=> JSON.parse(对))

如果担心浏览器ES2015支持,Babel或类似工具transpile它下降到ES5。