Le moyen le plus rapide de détecter si une entrée en double existe dans javascript array?

var arr = ['test0','test2','test0']; 

Comme ci-dessus, il y a deux entrées identiques avec la valeur "test0", comment vérifier le plus efficacement possible?

Si vous trimez le tableau, les doublons sont à côté de l'autre afin qu'ils soient faciles à trouver:

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

Cela fera le travail sur n'importe quel tableau et est probablement aussi optimisé que possible pour traiter le cas général (trouver un duplicata dans n'importe quel tableau possible). Pour des cas plus spécifiques (p. Ex. Des tableaux contenant uniquement des chaînes), vous pourriez faire mieux que cela.

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

Loop s'arrête lorsqu'il est trouvé en premier exemplaire:

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

Modifier (résoudre le problème '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; } 

Cela corrigera le cas has_duplicates (['toString']); etc..

En supposant que tout ce que vous voulez, c'est de détecter le nombre de doublons de test0 dans le tableau. Je suppose qu'un moyen simple de le faire est d'utiliser la méthode de jointure pour transformer le tableau dans une chaîne, puis utiliser la méthode de correspondance.

 var arr= ['test0','test2','test0']; var str = arr.join(); console.log(str) //"test0,test2,test0" var duplicates = str.match(/test0/g); var duplicateNumber = duplicates.length; console.log(duplicateNumber); //2 

Le tri est O (n log n) et non O (n). La construction d'une carte de hachage est O (n). Cela coûte plus de mémoire qu'une sorte de morcellement, mais vous avez demandé le «plus rapide». (Je suis favorable, cela peut être optimisé, mais il est optimal jusqu'à un facteur constant.)

 function hasDuplicate(arr) { var hash = {}; var hasDuplicate = false; arr.forEach(function(val) { if (hash[val]) { hasDuplicate = true; return; } hash[val] = true; }); return hasDuplicate; } 
  var index = myArray.indexOf(strElement); if (index < 0) { myArray.push(strElement); console.log("Added Into Array" + strElement); } else { console.log("Already Exists at " + index); }