如何在JavaScript中从二维数组中过滤相同的子数组
How to filter the same sub-array from two-dimensional array in JavaScript
假设存在多个无序整数元素子数组,例如:
[[1, 2], [2, 1], [3, 2, 2], [2], [2, 1, 3], [2, 2, 3]]
我想对每个子数组中的元素排序并删除重复项。因此,在处理这些数据之后,结果应该如下所示:
[[1, 2], [2, 2, 3], [2], [1, 2, 3]]
我如何在JavaScript中有效地做到这一点?
如果您的数据实际上是整数数组,您可以这样做
// ES6
let data = [[1, 2], [2, 1], [3, 2, 2], [2], [2, 1, 3], [2, 2, 3]];
// non-mutating sort function
function sort(x) { let y = x.slice(0); y.sort(); return y; }
let final = data.map(x => JSON.stringify(sort(x))).reduce((res, x) =>
res.indexOf(x) === -1 ? res.concat(x) : res
, []).map(JSON.parse);
console.log(data);
console.log(final);
// [[1,2],[2,1],[3,2,2],[2],[2,1,3],[2,2,3]]
// [[1,2],[2,2,3],[2],[1,2,3]]
请注意,我的解决方案不不必要地改变你的输入data
(像这里提供的其他解决方案)
如果你需要ES5代码,在这里
// ES5
var data = [[1, 2], [2, 1], [3, 2, 2], [2], [2, 1, 3], [2, 2, 3]];
// non-mutating sort function
function sort(x) {
var y = x.slice(0);y.sort();return y;
}
var final = data.map(function (x) {
return JSON.stringify(sort(x));
}).reduce(function (res, x) {
return res.indexOf(x) === -1 ? res.concat(x) : res;
}, []).map(JSON.parse);
console.log(data);
console.log(final);
// [[1,2],[2,1],[3,2,2],[2],[2,1,3],[2,2,3]]
// [[1,2],[2,2,3],[2],[1,2,3]]
首先,我们需要对子数组进行排序。这很容易,因为有一个内置的JavaScript函数sort()
:
var arr = [[1, 2], [2, 1], [3, 2, 2], [2], [2, 1, 3], [2, 2, 3]];
arr.forEach(function(subarr) {
subarr.sort();
});
document.body.innerHTML = JSON.stringify(arr);
现在,我们需要删除重复项。有两种方法可以做到这一点-适当和hack。我将描述一个粗俗的。要比较两个数组,您可以简单地比较它们的字符串表示:
var arr = [[1, 2], [2, 1], [3, 2, 2], [2], [2, 1, 3], [2, 2, 3]];
arr.forEach(function(subarr) {
subarr.sort();
});
var arrStrings = [];
arr = arr.filter(function(subarr) {
var stringified = JSON.stringify(subarr); // or simply .toString()
if (arrStrings.indexOf(stringified) === -1)
{
arrStrings.push(stringified);
return true;
} else {
return false;
}
});
document.body.innerHTML = JSON.stringify(arr);
比较数组有许多简单而合适的解决方案,您可以阅读这篇StackOverflow文章并选择您喜欢的
让我们加入另一种解决方案
var arr = [[1, 2], [2, 1], [3, 2, 2], [2], [2, 1, 3], [2, 2, 3]];
var temp = {};
var updated = arr.reduce(function(prev, arr){
var adj = arr.slice(0).sort();
if (!temp[adj.join(",")]) {
prev.push(adj);
temp[adj.join(",")] = true;
}
return prev;
},[]);
console.log(JSON.stringify(updated));
您可以尝试这样做:首先对它们进行排序,然后删除重复项。
var x=[[1, 2], [2, 1], [3, 2, 2], [2], [2, 1, 3], [2, 2, 3]];
for(i in x){
x[i].sort();
}
b = uniqBy(x, JSON.stringify)
document.getElementById("data").innerHTML=JSON.stringify(b);
function uniqBy(a, key) {
var seen = {};
return a.filter(function(item) {
var k = key(item);
return seen.hasOwnProperty(k) ? false : (seen[k] = true);
})
}
<div id="data"></div>
就用这个javascript:
var arr = [[1, 2], [2, 1], [3, 2, 2], [2], [2, 1, 3], [2, 2, 3]];
function sortArray(array) {
var count = array.length;
var sorted = array.sort();
var equal = true;
for (var i=0;i<count;i++) {
if (array[i].length > 1)
array[i].sort();
}
array.sort().sort();
for (var i=0;i<count;i++) {
if (array[i] && array[i+1]) {
for (var j=0, len=array[i].length; j<len; j++) {
if (array[i][j] !== array[i+1][j])
equal = false;
}
if (equal)
array.splice(i,1);
equal = true;
}
}
console.log(array);
}
sortArray(arr);
希望有帮助!!
相关文章:
- 使用一个键的值数组过滤多个javascript对象
- 根据另一个包含角度 js 中对象的数组过滤包含对象的数组
- Javascript:按字符串数组过滤对象数组
- 在 javascript 中使用数组过滤 for AngularJS
- 挖空和选择器的数组过滤问题
- Lodash 按数组的属性数组过滤
- 如何用另一个字符串数组过滤ng重复中的字符串数组
- 如何根据javascript数组过滤rss数据
- 基于NodeJS中的其他数组过滤/搜索对象的JavaScript数组
- 使用不带嵌套循环的数组过滤对象数组js
- 使用数组过滤数组Javascript
- 用一维数组过滤多维数组
- AngularJS:如何给值数组过滤
- Angularjs,逐个数组过滤
- 用另一个对象数组过滤Javascript对象数组
- 创建搜索栏以将数组过滤到表中
- 通过id数组过滤角度数据
- coffeescript -数组过滤不工作
- Backbone.js:如何通过模型ID数组过滤对象集合
- 使用基于嵌套值的数组过滤对象数组