Come controllo se un array include un valore in JavaScript?

Qual è il modo più conciso ed efficiente per scoprire se un array JavaScript contiene un valore?

Questo è l'unico modo che conosco per farlo:

function contains(a, obj) {
    for (var i = 0; i < a.length; i++) {
        if (a[i] === obj) {
            return true;
        }
    }
    return false;
}

C'è un modo migliore e più conciso per farlo?

Questo è strettamente correlato alla domanda di Stack Overflow Miglior modo per trovare un elemento in un array JavaScript? che si occupa di trovare oggetti in un array usando indexOf.

Aggiornamento dal 2019: Questa risposta è del 2008 (11 anni fa!) e non è rilevante per l'uso moderno di JS. Il miglioramento delle prestazioni promesso era basato su un benchmark fatto nei browser di quel tempo. Potrebbe non essere rilevante per i moderni contesti di esecuzione JS. Se avete bisogno di una soluzione facile, cercate altre risposte. Se avete bisogno delle migliori prestazioni, fate un benchmark da soli negli ambienti di esecuzione rilevanti.

Come altri hanno detto, l'iterazione attraverso l'array è probabilmente il modo migliore, ma è stato dimostrato che un ciclo while decrescente è il modo più veloce per iterare in JavaScript. Quindi potresti voler riscrivere il tuo codice come segue:

function contains(a, obj) {
    var i = a.length;
    while (i--) {
       if (a[i] === obj) {
           return true;
       }
    }
    return false;
}

Naturalmente, potreste anche estendere il prototipo Array:

Array.prototype.contains = function(obj) {
    var i = this.length;
    while (i--) {
        if (this[i] === obj) {
            return true;
        }
    }
    return false;
}

E ora puoi semplicemente usare il seguente:

alert([1, 2, 3].contains(2)); // => true
alert([1, 2, 3].contains('2')); // => false
Commentari (16)

indexOf forse, ma è un "estensione JavaScript allo standard ECMA-262; come tale potrebbe non essere presente in altre implementazioni dello standard."

Esempio:

[1, 2, 3].indexOf(1) => 0
["foo", "bar", "baz"].indexOf("bar") => 1
[1, 2, 3].indexOf(4) => -1

AFAICS Microsoft non offre un qualche tipo di alternativa a questo, ma è possibile aggiungere funzionalità simili agli array in Internet Explorer (e altri browser che non supportano indexOf) se si vuole, come rivela una rapida ricerca su Google (per esempio, questo).

Commentari (4)

Se stai usando JavaScript 1.6 o successivo (Firefox 1.5 o successivo) puoi usare Array.indexOf. Altrimenti, penso che ti ritroverai con qualcosa di simile al tuo codice originale.

Commentari (0)