Controlla se un elemento è presente in un array

La funzione che sto usando ora per controllare questo è la seguente:

function inArray(needle,haystack)
{
    var count=haystack.length;
    for(var i=0;i<count;i++)
    {
        if(haystack[i]===needle){return true;}
    }
    return false;
}

Funziona. Quello che sto cercando è se c'è un modo migliore per farlo.

Codice:

function isInArray(value, array) {
  return array.indexOf(value) > -1;
}

Esecuzione:

isInArray(1, [1,2,3]); // true

Aggiornamento (2017):

Nei browser moderni che seguono lo standard ECMAScript 2016 (ES7), è possibile utilizzare la funzione Array.prototype.includes, che rende molto più facile controllare se un elemento è presente in un array:

const array = [1, 2, 3];
const value = 1;
const isInArray = array.includes(value);
console.log(isInArray); // true
Commentari (7)

Basta usare indexOf:

haystack.indexOf(needle) >= 0

Se vuoi supportare i vecchi Internet Explorers (< IE9), dovrai includere il tuo codice attuale come workaround però.

A meno che la tua lista non sia ordinata, hai bisogno di confrontare ogni valore con l'ago. Pertanto, sia la tua soluzione che indexOf dovranno eseguire in media n/2 confronti. Tuttavia, poiché indexOf è un metodo incorporato, può utilizzare ulteriori ottimizzazioni e sarà leggermente più veloce in pratica. Nota che a meno che la tua applicazione cerchi nelle liste estremamente spesso (diciamo 1000 volte al secondo) o le liste siano enormi (diciamo 100k voci), la differenza di velocità non avrà importanza.

Commentari (6)

Potete usare la funzione _contains dalla libreria underscore.js per ottenere questo:

if (_.contains(haystack, needle)) {
  console.log("Needle found.");
};
Commentari (2)