Memeriksa apakah suatu elemen ada dalam array

Fungsi yang saya gunakan sekarang untuk memeriksa ini adalah sebagai berikut:

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

Ia bekerja. Apa yang saya'm cari adalah apakah ada cara yang lebih baik untuk melakukan hal ini.

Mengomentari pertanyaan (4)
Larutan

ECMAScript 2016 menggabungkan termasuk() metode untuk array yang secara khusus memecahkan masalah, dan sekarang adalah metode yang disukai.

[1, 2, 3].includes(2);     // true
[1, 2, 3].includes(4);     // false
[1, 2, 3].includes(1, 2);  // false (second parameter is the index position in this array at which to begin searching)

JULI 2018, ini belum diimplementasikan di hampir semua utama browser, jika anda perlu untuk mendukung YAITU polyfill yang tersedia.

Edit: Perhatikan bahwa ini mengembalikan false jika item dalam array adalah objek. Hal ini karena benda-benda serupa adalah dua objek yang berbeda dalam JavaScript.

Komentar (10)

Kode:

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

Pelaksanaan:

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

Update (2017):

Di browser modern yang mengikuti ECMAScript 2016 (ES7) standar, anda dapat menggunakan fungsi Array.prototype.includes, yang membuatnya lebih mudah untuk memeriksa apakah item tersebut ada dalam array:

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

Hanya menggunakan indexOf:

haystack.indexOf(needle) >= 0

Jika anda ingin dukungan tua Penjelajah Internet (< IE9), anda'll harus ini seperti anda saat ini kode sebagai solusi meskipun.

Kecuali anda daftar yang diurutkan, anda perlu membandingkan setiap nilai pada jarum. Oleh karena itu, kedua solusi dan indexOf akan memiliki untuk melaksanakan n/2 perbandingan rata-rata. Namun, sejak indexOf adalah metode built-in, mungkin menggunakan optimasi tambahan dan akan sedikit lebih cepat dalam praktek. Catatan: jika aplikasi pencarian di daftar sangat sering (katakanlah 1000 kali per detik) atau daftar yang besar (katakanlah 100k entri), perbedaan kecepatan tidak akan peduli.

Komentar (6)

Saya mengacu kepada beberapa kali di Google Chrome 52, tetapi merasa bebas untuk copypaste ke browser lain's konsol.


~ 1500 ms, meliputi (~ 2700 ms ketika saya menggunakan polyfill)

var array = [0,1,2,3,4,5,6,7,8,9]; 
var result = 0;

var start = new Date().getTime();
for(var i = 0; i < 10000000; i++)
{
  if(array.includes("test") === true){ result++; }
}
console.log(new Date().getTime() - start);

~ 1050 ms, indexOf

var array = [0,1,2,3,4,5,6,7,8,9]; 
var result = 0;

var start = new Date().getTime();
for(var i = 0; i < 10000000; i++)
{
  if(array.indexOf("test") > -1){ result++; }
}
console.log(new Date().getTime() - start);

~ 650 ms, fungsi kustom

function inArray(target, array)
{

/* Caching array.length doesn't increase the performance of the for loop on V8 (and probably on most of other major engines) */

  for(var i = 0; i < array.length; i++) 
  {
    if(array[i] === target)
    {
      return true;
    }
  }

  return false; 
}

var array = [0,1,2,3,4,5,6,7,8,9]; 
var result = 0;

var start = new Date().getTime();
for(var i = 0; i < 10000000; i++)
{
  if(inArray("test", array) === true){ result++; }
}
console.log(new Date().getTime() - start);
Komentar (1)

Satu baris kode.. akan mengembalikan nilai true atau false

!!(arr.indexOf("val")+1)
Komentar (4)

Anda dapat menggunakan indexOf Tetapi tidak bekerja dengan baik di versi terakhir internet explorer. Kode:

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

Pelaksanaan:

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

Saya sarankan anda menggunakan kode berikut:

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

Anda dapat menggunakan _contains fungsi dari underscore.js perpustakaan untuk mencapai hal ini:

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

Sejak ECMAScript6, satu dapat menggunakan Set :

var myArray = ['A', 'B', 'C'];
var mySet = new Set(myArray);
var hasB = mySet.has('B'); // true
var hasZ = mySet.has('Z'); // false
Komentar (0)

Tergantung pada ukuran jarum yang anda'kembali mencari Array.filter mungkin berguna. Berikut ini's contoh:

let filtered, arr = ['Haystack', 'Needle'];
filtered = arr.filter((elem) => {
  return elem.toLowerCase() === 'needle';
});
// filtered => ['needle']
Komentar (0)

Di lodash anda dapat menggunakan _.termasuk (yang juga alias _.berisi)

Anda dapat mencari seluruh array:

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

Anda dapat mencari array dari awal indeks:

_.includes([1, 2, 3], 1, 1);  // false (begins search at index 1)

Cari string:

_.includes('pebbles', 'eb');  // true (string contains eb)

Juga bekerja untuk memeriksa array sederhana dari benda-benda:

_.includes({ 'user': 'fred', 'age': 40 }, 'fred');    // true
_.includes({ 'user': 'fred', 'age': false }, false);  // true

Satu hal yang perlu diperhatikan tentang kasus terakhir adalah bekerja untuk primitif seperti string, angka, dan boolean tapi tidak dapat mencari melalui array atau objek

_.includes({ 'user': 'fred', 'age': {} }, {});   // false
_.includes({ 'user': [1,2,3], 'age': {} }, 3);   // false
Komentar (0)