我有一个二维数组:
[[7,3], [7,3], [3,8], [7,3], [7,3], [1,2]]
有没有一种聪明的方法从这个数组中删除重复元素?它应该返回这样的数组:
[[7,3], [3,8], [1,2]]
谢谢!
我有一个二维数组:
[[7,3], [7,3], [3,8], [7,3], [7,3], [1,2]]
有没有一种聪明的方法从这个数组中删除重复元素?它应该返回这样的数组:
[[7,3], [3,8], [1,2]]
谢谢!
arr = [[7,3], [7,3], [3,8], [7,3], [7,3], [1,2]];
function multiDimensionalUnique(arr) {
var uniques = [];
var itemsFound = {};
for(var i = 0, l = arr.length; i < l; i++) {
var stringified = JSON.stringify(arr[i]);
if(itemsFound[stringified]) { continue; }
uniques.push(arr[i]);
itemsFound[stringified] = true;
}
return uniques;
}
multiDimensionalUnique(arr);
解释:
像您所提到的,其他问题只涉及单维数组..可以通过indexOf找到它们。这很容易。多维数组不那么容易,因为indexOf无法用于查找内部数组。
我能想到的最直接的方法是对数组值进行序列化,并存储它是否已被发现。做一些类似于stringified = arr [i] [0] +“:”+ arr [i] [1]
的事情可能更快,但那样你就只限制了两个键。
需要使用JavaScript 1.7:
var arr = [[7,3], [7,3], [3,8], [7,3], [7,3], [1,2]];
arr.map(JSON.stringify).filter((e,i,a) => i === a.indexOf(e)).map(JSON.parse)
// [[7,3], [3,8], [1,2]]
最短版本由jsN00b提供。
arr.map(JSON.stringify).filter((el, i , ar)=> i === ar.indexOf(el)).map(JSON.parse)
。 - jsBugvar origin = [[7,3], [7,3], [3,8], [7,3], [7,3], [1,2]];
function arrayEqual(a, b) {
if (a.length !== b.length) { return false; }
for (var i = 0; i < a.length; ++i) {
if (a[i] !== b[i]) {
return false;
}
}
return true;
}
function contains(array, item) {
for (var i = 0; i < array.length; ++i) {
if (arrayEqual(array[i], item)) {
return true;
}
}
return false;
}
function normalize(array) {
var result = [];
for (var i = 0; i < array.length; ++i) {
if (!contains(result, array[i])) {
result.push(array[i]);
}
}
return result;
}
var result = normalize(origin);
console.log(result);
[[7, 3], [3, 7]]
怎么处理?您是将其视为两个不同的元素,还是重复元素? - Sean