从重复的数组中过滤数组

时间:2017-01-06 12:53:47

标签: javascript arrays

我有一个数组:

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

5 个答案:

答案 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;
&#13;
&#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);