如何使用filter()方法从JavaScript中的数组数组中获取不同的值?




arrays (5)

有效解决方案

O(n) 运算,其中 nx 数组的长度

O(n) 内存空间,其中 nx 数组的长度

const x = [[1, 2], [3, 4], [1, 2]];

const arrayTable = Object.create(null);

const uniqueArrays = x.filter(arr => {
  const arrStr = JSON.stringify(arr);

  if (!arrayTable[arrStr]) {
    arrayTable[arrStr] = true;
    return true;
  }

  return false;
});

console.log(uniqueArrays);

这个问题在这里已有答案:

我有这样一个数组:

let x = [[1, 2], [3, 4], [1, 2], [2, 1]];

如何检索没有重复项的数组?

[[1, 2], [3, 4], [2, 1]];

我想使用过滤方法。 我试过这个,但它不起作用:

x.filter((value,index,self) => (self.indexOf(value) === index))

编辑:正如我指定使用过滤方法,我不认为这个问题是重复的。 另外,我得到了几个有趣的答案。


好的,字符串哈希的想法很棒。 I wrestled a bear once 道具。 我认为代码本身可能会更好一些,所以这就是我倾向于做这种事情的方式:

let x = [[1, 2], [3, 4], [1, 2]];
const map = new Map();
x.forEach((item) => map.set(item.join(), item));
console.log(Array.from(map.values()));

如果你想要一个丑陋的衬垫:

let x = [[1, 2], [3, 4], [1, 2]];
const noRepeats = Array.from((new Map(x.map((item) => [item.join(), item]))).values());
console.log(noRepeats);


相当于

x.filter((value,index,self) => (self.indexOf(value) === index))

将会

x.filter((v,i,self) => {
for1:
  for (let j = 0; j < self.length; j++) {
    if (i == j) {
      return true;
    }
    if (self[j].length != v.length) {
      continue;
    }
    for (let k = 0; k < v.length; k++) {
      if (self[j][k] != v[k]) {
        continue for1;
      }
    }
    return false;
  }
  return true;
})

与其他一些答案不同,这不需要转换为字符串,因此可以使用更复杂的值。 如果需要,请使用 === 而不是 ==

当然,时间复杂性并不大。


过滤只会导致事物进入O(n ^ 2)。

当前接受的答案使用 .filter((itm, idx, arr) => arr.indexOf(itm) === idx) ,这将导致每次迭代期间每次迭代数组... n ^ 2。

为什么要去那里? 不仅如此,您还需要解析。 这是多余的。

在没有按下O(n ^ 2)的情况下过滤没有真正好的方法。

相反,只需使用reduce。 它非常简单快速地轻松完成O(n)。

“Bin将设置减少到唯一值。”

let x = [[1, 2], [3, 4], [1, 2], [2, 1]];
let y = Object.values(x.reduce((p,c) => (p[JSON.stringify(c)] = c,p),{}));
console.log(y);

如果你 必须 去过滤器的路线,那么必须使用n ^ 2。 您可以使用每个项目迭代查找存在的每个项目。

“保留每个没有先前复制的元素。”

let x = [
  [1, 2],
  [3, 4],
  [1, 2],
  [2, 1]
];
let y = x.filter((lx, li) =>
  x.every((rx, ri) =>
    rx == lx ||
    (JSON.stringify(lx) != JSON.stringify(rx) || li < ri))
);
console.log(y);


indexOf 不适用于 arrays / objects 类型元素的相同实例,因为这样的数组只保存引用。

在过滤器函数实例中,通过参数 v (在下面的代码中)得到的数据与存储在数组中的实例不同,使得 indexOf 无法返回它的索引。

在下面的代码中,通过将对象转换为字符串,我们可以使用 indexOf 来查找重复项。

let x = [[1, 2], [3, 4], [1, 2], [2, 1]];

console.log(x.
  map(function(v){
    return JSON.stringify(v)
  })
  .filter(function(v, i, o) {
    return o.length == i ? true : o.slice(i + 1).indexOf(v) == -1;
  })
  .map(function(v) {
    return JSON.parse(v)
  })
);





arrays