获取数组中的所有非唯一值(即:重复/多次出现)

我需要检查一个JavaScript数组,看看是否有重复的值。最简单的方法是什么?我只需要查找重复的值是什么-我实际上不需要它们的索引或它们被重复多少次。

我知道我可以遍历数组并检查所有其他值是否匹配,但是似乎应该有一种更简单的方法。

类似的问题:

番长2020/03/28 17:48:42

更新:简短的一线以获得重复:

[1, 2, 2, 4, 3, 4].filter((e, i, a) => a.indexOf(e) !== i) // [2, 4]

要获得没有重复的数组,只需将条件反转即可:

[1, 2, 2, 4, 3, 4].filter((e, i, a) => a.indexOf(e) === i) // [1, 2, 3, 4]

我只是filter()在下面的旧答案中没有考虑过;)


当您只需要检查是否存在此问题所要求的重复项时,可以使用以下every()方法:

[1, 2, 3].every((e, i, a) => a.indexOf(e) === i) // true

[1, 2, 1].every((e, i, a) => a.indexOf(e) === i) // false

请注意,该every()功能不适用于IE 8及更低版本。

西里神奇2020/03/28 17:48:42

在数组中查找重复值

这应该是在数组中实际查找重复值的最短方法之一。正如OP明确要求的那样,这不会删除重复项,而是会找到它们

var input = [1, 2, 3, 1, 3, 1];

var duplicates = input.reduce(function(acc, el, i, arr) {
  if (arr.indexOf(el) !== i && acc.indexOf(el) < 0) acc.push(el); return acc;
}, []);

document.write(duplicates); // = 1,3 (actual array == [1, 3])

这不需要排序或任何第三方框架。它也不需要手动循环。它可以与indexOf()的每个值一起使用(或更清楚:严格的比较运算符)支持。

由于reduce()indexOf(),因此至少需要IE 9。

米亚2020/03/28 17:48:42

如果要消除重复项,请尝试以下出色的解决方案:

function eliminateDuplicates(arr) {
  var i,
      len = arr.length,
      out = [],
      obj = {};

  for (i = 0; i < len; i++) {
    obj[arr[i]] = 0;
  }
  for (i in obj) {
    out.push(i);
  }
  return out;
}

资料来源:http : //dreaminginjavascript.wordpress.com/2008/08/22/eliminate-duplicates/