我有一个数组:
var arr = [[1,7],[2,6],[3,5],[4,4],[5,3],[6,2],[7,1]];
我想要的只是从重复的数组中过滤它们。所以它看起来像:
var arr = [[1,7],[2,6],[3,5],[4,4]];
答案 0 :(得分:4)
您可以使用filter()
,some()
和every()
执行此操作。
var arr = [[1,7],[2,6],[3,5],[4,4],[5,3],[6,2],[7,1]];
var result = arr.filter(function(e) {
var r = this.some(function(a) {
return e.every(function(b) {
return a.includes(b)
})
})
if (!r) {
this.push(e);
return e
}
}, [])
console.log(result)
如果你想使用箭头功能,你也可以这样写。
var arr = [[1,7],[2,6],[3,5],[4,4],[5,3],[6,2],[7,1]];
var result = arr.filter(function(e) {
return !this.some(a =>e.every(b =>a.includes(b))) ? this.push(e) && e : false
}, [])
console.log(result)
答案 1 :(得分:3)
您可以使用哈希表并将已排序数组的连接字符串用作哈希值。
var arr = [[1, 7], [2, 6], [3, 5], [4, 4], [5, 3], [6, 2], [7, 1]],
result = arr.filter(function(a) {
var hash = a.slice().sort(function (a, b) { return a - b; }).join();
if (!this[hash]) {
this[hash] = true;
return true;
}
}, Object.create(null));
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
ES6 with Set
var asc = (a, b) => a - b,
join = a => a.slice().sort(asc).join(),
arr = [[1, 7], [2, 6], [3, 5], [4, 4], [5, 3], [6, 2], [7, 1]],
result = arr.filter((hash => a => (h => !hash.has(h) && hash.add(h))(join(a)))(new Set));
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
答案 2 :(得分:2)
这是解决方案:
首先,您应该将arrays
排序为[[1,7],[2,6],[3,5],[4,4],[3,5],[2,6],[1,7]]
,然后排除duplicates
。
使用filter
函数过滤数组中的值。 seen
它是一本字典,我用它来验证是否在其中找到了当前值(见过字典)。如果是,"删除"数组的值。如果没有,请设置当前使用的数组并转到下一个项目。我说"删除"因为filter
函数会创建一个新数组。
filter
功能很容易理解。详细了解相关信息,here
var arr = [[1,7],[2,6],[3,5],[4,4],[5,3],[6,2],[7,1]];
arr.forEach(function(array){
array.sort((a,b)=>a>b);
});
var seen = {};
var uniqueArray = arr.filter(function(item) {
return seen.hasOwnProperty(item) ? false : (seen[item] = true);
});
console.log(uniqueArray);

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
&#13;
答案 3 :(得分:0)
使用
的解决方案
Array.prototype.map()
,
Array.prototype.filter()
,Array.prototype.join()
,String.prototype.split()
函数:
var arr = [[1,7],[2,6],[3,5],[4,4],[5,3],[6,2],[7,1]];
result = arr.map(function (a) {
a.sort();
return a.join();
}).filter(function (inner_arr, idx, a) {
return idx === a.lastIndexOf(inner_arr);
}).map(function(s){
return s.split(',');
});
console.log(result);
答案 4 :(得分:0)
正如我所看到的,所有解决方案都保持原始阵列的完整性。 如果这不是问题,这里还有一个肉和土豆™,直接的解决方案:
var arr = [[1,7],[2,6],[3,5],[4,4],[5,3],[6,2],[7,1]];
temp=[];
unique=[];
for(i=0;i<arr.length;i++) {
str=arr[i].sort().toString();
if(temp.indexOf(str)===-1) {
temp.push(str);
unique.push(arr[i]);
}
}
console.log(unique);