it-swarm.it

In Javascript, come posso verificare se un array ha valori duplicati?

Possibile duplicato:
Il modo più semplice per trovare valori duplicati in un array javascript

Come posso verificare se un array ha valori duplicati?

Se alcuni elementi dell'array sono uguali, restituisce true. Altrimenti, restituisci false.

['hello','goodbye','hey'] //return false because no duplicates exist
['hello','goodbye','hello'] // return true because duplicates exist
63
user847495

Se si dispone di un ambiente ES2015 (al momento della stesura di questo documento: io.js, IE11, Chrome, Firefox, WebKit di notte), funzionerà quanto segue e sarà veloce (vale a dire O (n)):

function hasDuplicates(array) {
    return (new Set(array)).size !== array.length;
}

Se sono necessari solo valori stringa nell'array, funzionerà quanto segue:

function hasDuplicates(array) {
    var valuesSoFar = Object.create(null);
    for (var i = 0; i < array.length; ++i) {
        var value = array[i];
        if (value in valuesSoFar) {
            return true;
        }
        valuesSoFar[value] = true;
    }
    return false;
}

Usiamo una "tabella hash" valuesSoFar le cui chiavi sono i valori che abbiamo visto finora nella matrice. Effettuiamo una ricerca usando in per vedere se quel valore è già stato individuato; in tal caso, usciremo dal loop e restituiremo true.


Se hai bisogno di una funzione che funzioni per più di semplici valori di stringa, funzionerà quanto segue, ma non è altrettanto performante; e 'acceso2) invece di O (n).

function hasDuplicates(array) {
    var valuesSoFar = [];
    for (var i = 0; i < array.length; ++i) {
        var value = array[i];
        if (valuesSoFar.indexOf(value) !== -1) {
            return true;
        }
        valuesSoFar.Push(value);
    }
    return false;
}

La differenza è semplicemente che usiamo un array invece di una tabella hash per valuesSoFar, poiché le "tabelle hash" di JavaScript (ovvero gli oggetti) hanno solo chiavi stringa. Ciò significa che perdiamo il tempo di ricerca O(1) di in, invece di ottenere un tempo di ricerca O(n) di indexOf.

164
Domenic

Un altro approccio (anche per elementi oggetto/array all'interno dell'array1) potrebbe essere2:

function chkDuplicates(arr,justCheck){
  var len = arr.length, tmp = {}, arrtmp = arr.slice(), dupes = [];
  arrtmp.sort();
  while(len--){
   var val = arrtmp[len];
   if (/nul|nan|infini/i.test(String(val))){
     val = String(val);
    }
    if (tmp[JSON.stringify(val)]){
       if (justCheck) {return true;}
       dupes.Push(val);
    }
    tmp[JSON.stringify(val)] = true;
  }
  return justCheck ? false : dupes.length ? dupes : null;
}
//usages
chkDuplicates([1,2,3,4,5],true);                           //=> false
chkDuplicates([1,2,3,4,5,9,10,5,1,2],true);                //=> true
chkDuplicates([{a:1,b:2},1,2,3,4,{a:1,b:2},[1,2,3]],true); //=> true
chkDuplicates([null,1,2,3,4,{a:1,b:2},NaN],true);          //=> false
chkDuplicates([1,2,3,4,5,1,2]);                            //=> [1,2]
chkDuplicates([1,2,3,4,5]);                                //=> null

Vedi anche ...

1 necessita di un browser che supporti JSON o libreria JSON in caso contrario.
2modificare: La funzione può ora essere utilizzata per un semplice controllo o per restituire una matrice di valori duplicati

3
KooiInc