Domanda Come posso verificare se un array include un oggetto in JavaScript?


Qual è il modo più conciso ed efficace per scoprire se una matrice JavaScript contiene un oggetto?

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 realizzare questo?

Questo è strettamente correlato alla domanda Stack Overflow Il modo migliore per trovare un oggetto in un array JavaScript? che si rivolge alla ricerca di oggetti in un array usando indexOf.


3216
2017-10-25 22:14


origine


risposte:


I browser correnti hanno Array#includes, che fa Esattamente quella, è ampiamente supportatoe ha un polyfill per i browser più vecchi.

> ['joe', 'jane', 'mary'].includes('jane');
true 

Puoi anche usare Array#indexOf, che è meno diretto, ma non richiede Polyfills per i browser non aggiornati.

offerte jQuery $.inArray, che è funzionalmente equivalente a Array#indexOf.

underscore.js, una libreria di utilità JavaScript, offre _.contains(list, value), alias _.include(list, value), entrambi i quali usano indice di internamente se ha passato un array JavaScript.

Alcuni altri framework offrono metodi simili:

Si noti che alcuni framework implementano questa funzione come funzione, mentre altri aggiungono la funzione al prototipo dell'array.


3643
2017-10-25 23:10



Aggiornamento: come @orip menziona nei commenti, il benchmark collegato è stato fatto nel 2008, quindi i risultati potrebbero non essere rilevanti per i browser moderni. Tuttavia, probabilmente hai bisogno di questo per supportare comunque i browser non moderni e probabilmente non sono stati aggiornati da allora. Prova sempre per te stesso.

Come altri hanno già detto, l'iterazione attraverso l'array è probabilmente il modo migliore, ma è così è stato dimostrato che in diminuzione while loop è il modo più veloce per scorrere 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, puoi anche estendere il prototipo di 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 quanto segue:

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

357
2017-10-25 22:49



indexOf forse, ma è un'estensione JavaScript per lo standard ECMA-262, in quanto 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 lo fa non offrire qualche tipo di alternativa a questo, ma è possibile aggiungere funzionalità simili agli array in Internet Explorer (e altri browser che non supportano indexOf) se vuoi, come a rivela una rapida ricerca su Google (per esempio, questo).


156
2018-01-01 01:40



ECMAScript 7 introduce Array.prototype.includes.

Può essere usato in questo modo:

[1, 2, 3].includes(2); // true
[1, 2, 3].includes(4); // false

Accetta anche un secondo argomento opzionale fromIndex:

[1, 2, 3].includes(3, 3); // false
[1, 2, 3].includes(3, -1); // true

a differenza di indexOf, che usa Rigoroso paragone di uguaglianza, includes confronta usando SameValueZero algoritmo di uguaglianza. Ciò significa che è possibile rilevare se un array include a NaN:

[1, 2, NaN].includes(NaN); // true

Inoltre a differenza indexOf, includes non salta gli indici mancanti:

new Array(5).includes(undefined); // true

Attualmente è ancora una bozza ma può esserlo polyfilledper farlo funzionare su tutti i browser.


128
2018-03-24 04:59



b è il valore e a è la matrice. Ritorna true o false:

function(a, b) {
    return a.indexOf(b) != -1
}

96
2017-10-27 00:38



Ecco un JavaScript 1.6 compatibile implementazione di Array.indexOf:

if (!Array.indexOf)
{
  Array.indexOf = [].indexOf ?
      function (arr, obj, from) { return arr.indexOf(obj, from); }:
      function (arr, obj, from) { // (for IE6)
        var l = arr.length,
            i = from ? parseInt( (1*from) + (from<0 ? l:0), 10) : 0;
        i = i<0 ? 0 : i;
        for (; i<l; i++) {
          if (i in arr  &&  arr[i] === obj) { return i; }
        }
        return -1;
      };
}

65
2017-09-13 17:32



Uso:

function isInArray(array, search)
{
    return array.indexOf(search) >= 0;
}

// Usage
if(isInArray(my_array, "my_value"))
{
    //...
}

46
2017-08-27 16:45