如何在JavaScript中从二维数组中过滤相同的子数组

How to filter the same sub-array from two-dimensional array in JavaScript

本文关键字:数组 过滤 二维数组 JavaScript      更新时间:2023-09-26

假设存在多个无序整数元素子数组,例如:

[[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);

希望有帮助!!