检测javascript数组中是否存在重复条目的最快方法?

Mas*_*ask 5 javascript arrays

var arr = ['test0','test2','test0'];
Run Code Online (Sandbox Code Playgroud)

与上面一样,有两个相同的条目,其值为"test0",如何最有效地检查它?

Guf*_*ffa 15

如果对数组进行排序,则重复项彼此相邻,以便于查找:

arr.sort();
var last = arr[0];
for (var i=1; i<arr.length; i++) {
   if (arr[i] == last) alert('Duplicate : '+last);
   last = arr[i];
}
Run Code Online (Sandbox Code Playgroud)


Tim*_*own 6

这将在任何阵列上完成工作,并且可能对处理一般情况(在任何可能的数组中找到重复)进行尽可能优化.对于更具体的情况(例如,只包含字符串的数组),您可以做得更好.

function hasDuplicate(arr) {
    var i = arr.length, j, val;

    while (i--) {
        val = arr[i];
        j = i;
        while (j--) {
            if (arr[j] === val) {
                return true;
            }
        }
    }
    return false;
}
Run Code Online (Sandbox Code Playgroud)


Dyl*_*son 5

这里有很多答案,但并不是所有人都“感觉”不错...所以我会戴上帽子。

如果您使用lodash

function containsDuplicates(array) {
  return _.uniq(array).length !== array.length; 
}
Run Code Online (Sandbox Code Playgroud)

如果可以使用ES6集,它将变成:

function containsDuplicates(array) {
  return array.length !== new Set(array).size
}
Run Code Online (Sandbox Code Playgroud)

使用香草javascript:

function containsDuplicates(array) {
  return array
    .sort()
    .some(function (item, i, items) {
      return item === items[i + 1]
    })
}
Run Code Online (Sandbox Code Playgroud)

但是,有时您可能需要检查项目是否在某个字段上重复。

这就是我的处理方式:

containsDuplicates([{country: 'AU'}, {country: 'UK'}, {country: 'AU'}], 'country')

function containsDuplicates(array, attribute) {
  return array
    .map(function (item) { return item[attribute] })
    .sort()
    .some(function (item, i, items) {
      return item === items[i + 1]
    })
}
Run Code Online (Sandbox Code Playgroud)


Ana*_*liy 3

当找到第一个重复项时循环停止:

function has_duplicates(arr) {

    var x = {}, len = arr.length;
    for (var i = 0; i < len; i++) {
        if (x[arr[i]]) {
             return true;
        }
        x[arr[i]] = true;
    }
    return false;

}
Run Code Online (Sandbox Code Playgroud)

编辑(修复“toString”问题):

function has_duplicates(arr) {

    var x = {}, len = arr.length;
    for (var i = 0; i < len; i++) {
        if (x[arr[i]] === true) {
             return true;
        }
        x[arr[i]] = true;
    }
    return false;

}
Run Code Online (Sandbox Code Playgroud)

这将纠正 has_duplicates(['toString']) 的情况;ETC..

  • 注意:使用对象作为地图有困难。键只能是字符串,并且作为 Object 成员的名称会使它混淆。例如。`has_duplicates(['toString'])` 是 `true`。 (2认同)