Pertanyaan Bagaimana cara memeriksa apakah suatu array memasukkan objek dalam JavaScript?


Apa cara yang paling ringkas dan efisien untuk mengetahui apakah array JavaScript berisi objek?

Ini adalah satu-satunya cara yang saya tahu untuk melakukannya:

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

Apakah ada cara yang lebih baik dan lebih ringkas untuk mencapai hal ini?

Ini sangat terkait erat dengan pertanyaan Stack Overflow Cara terbaik untuk menemukan item dalam Array JavaScript? yang membahas menemukan objek dalam sebuah array menggunakan indexOf.


3217
2017-10-25 22:14


asal


Jawaban:


Browser yang ada saat ini Array#includes, yang mana persis bahwa, didukung secara luas, dan memiliki polyfill untuk browser yang lebih lama.

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

Anda juga bisa menggunakan Array#indexOf, yang kurang langsung, tetapi tidak memerlukan Polyfill untuk browser yang sudah ketinggalan zaman.

penawaran jQuery $.inArray, yang secara fungsional setara dengan Array#indexOf.

underscore.js, perpustakaan utilitas JavaScript, menawarkan _.contains(list, value), alias _.include(list, value), keduanya digunakan Indeks secara internal jika melewati susunan JavaScript.

Beberapa kerangka lain menawarkan metode serupa:

Perhatikan bahwa beberapa kerangka menerapkan ini sebagai fungsi, sementara yang lain menambahkan fungsi ke prototipe array.


3644
2017-10-25 23:10



Pembaruan: Seperti yang disebutkan @orip dalam komentar, patokan yang terkait telah dilakukan pada tahun 2008, sehingga hasilnya mungkin tidak relevan untuk browser modern. Namun, Anda mungkin memerlukan ini untuk mendukung peramban non-modern dan mereka mungkin belum diperbarui sejak itu. Selalu ujilah sendiri.

Seperti yang orang lain katakan, iterasi melalui array mungkin adalah cara terbaik, tetapi itu telah terbukti bahwa suatu penurunan while loop adalah cara tercepat untuk melakukan iterasi di JavaScript. Jadi Anda mungkin ingin menulis ulang kode Anda sebagai berikut:

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

Tentu saja, Anda dapat juga memperpanjang prototipe Array:

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

Dan sekarang Anda cukup menggunakan hal-hal berikut:

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

357
2017-10-25 22:49



indexOf mungkin, tapi itu adalah "ekstensi JavaScript ke standar ECMA-262; karena itu mungkin tidak ada dalam penerapan standar lainnya."

Contoh:

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

AFAICS Microsoft melakukannya tidak menawarkan semacam alternatif untuk ini, tetapi Anda dapat menambahkan fungsi serupa ke array di Internet Explorer (dan browser lain yang tidak mendukung indexOf) jika Anda ingin, sebagai penelusuran Google cepat terungkap (sebagai contoh, yang ini).


156
2018-01-01 01:40



ECMAScript 7 memperkenalkan Array.prototype.includes.

Ini dapat digunakan seperti ini:

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

Ini juga menerima argumen kedua opsional fromIndex:

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

Tidak seperti indexOf, yang menggunakan Perbandingan Kesetaraan yang Ketat, includes membandingkan menggunakan SameValueZero algoritma persamaan. Itu berarti bahwa Anda dapat mendeteksi apakah array termasuk a NaN:

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

Juga tidak seperti itu indexOf, includes tidak melewatkan indeks yang hilang:

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

Saat ini masih draft tetapi bisa polyfilleduntuk membuatnya berfungsi di semua browser.


128
2018-03-24 04:59



b adalah nilai, dan a adalah array. Ia kembali true atau false:

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

96
2017-10-27 00:38



Ini a JavaScript 1,6 kompatibel implementasi dari 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



Menggunakan:

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

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

46
2017-08-27 16:45



Memperluas JavaScript Array objek adalah ide yang sangat buruk karena Anda memperkenalkan properti baru (metode kustom Anda) ke dalam for-in loop yang dapat merusak skrip yang ada. Beberapa tahun yang lalu para penulis Prototipe perpustakaan harus merekayasa ulang penerapan perpustakaan mereka untuk menghapus hal semacam ini.

Jika Anda tidak perlu khawatir tentang kompatibilitas dengan JavaScript lainnya yang berjalan di halaman Anda, lakukanlah, jika tidak, saya akan merekomendasikan solusi fungsi yang lebih canggung, tetapi lebih aman.


38
2017-07-18 14:36