用于检查JS数组中重复值的更快的代码

时间:2014-06-25 05:59:39

标签: javascript jquery arrays performance

var valueArray = ['ABC','DEF','GHI','ABC','JKL','MNO','DEF'];
var flag =false;
for(var i=0; i<valueArray.length; i++)
{
   for(var j=0; j<valueArray.length; j++)
  {
     if(valueArray[j] == valueArray[i] && j != i)
     {
          flag  = true;
          break;
     }
  }
}
if(flag)
    alert('same values found');

我试图通过检查重复值来验证一个数组,我使用上面的代码,我不认为这是一个更好的方法。 jquery是否有任何方法可以使用此js代码或{{1}}代码。

3 个答案:

答案 0 :(得分:1)

如果你想要快速,兼容,&#34;无处不在&#34;只检查重复项并且不需要任何库的函数,请考虑:

function hasDups(arr) {

  // Firstly copy array so don't affect original, then sort
  var t = arr.slice().sort();

  // If adjacent members have the same value, return true
  for (var i=1, iLen=t.length; i<iLen; i++) {
    if (t[i] === t[i-1]) return true;
  }
  return false;
}

console.log(hasDups(['abc','dvf','abc'])); // true

但是你可能想要一些功能更强大的东西,例如您可以提供比较功能,例如'abc' == 'ABC''5' == 5

或者,如果您想使用新功能并避免复制和排序,请考虑:

function hasDups2(arr) {
  var obj = {};
  return arr.some(function(v){
    if (obj.hasOwnProperty(v)) return true;
    obj[v] = '';
  });
}

同样的策略也可以应用于第一个策略,并避免使用ES5的某些。

请注意,上述两者仅适用于比较原始值,尽管第一个值更好。如果你想要一个可靠的函数来查找重复的对象,那就需要更多的工作。

答案 1 :(得分:1)

不确定jquery,但只有一个for循环,性能会更好:

for(var i = 0; i < valueArray.length; i++)
{
  if (valueArray.indexOf(valueArray[i], i+1) != -1) {
    flag = true;
    break;
  }
}

jsPerf测试:http://jsperf.com/check-for-double-occurences

答案 2 :(得分:0)

使用jquery.unique()并比较数组大小。如果结果数组的大小不相同,则返回false。

jquery.unique()的文档