JavaScript dalam susunan

152

Katakanlah saya punya ini:

var blockedTile = new Array("118", "67", "190", "43", "135", "520");

Ada lebih banyak elemen array tetapi itu hanya beberapa untuk tujuan keterbacaan. Ngomong-ngomong, saya bisa melakukan loop "for" tapi itu akan melakukan 500 loop setiap kali Anda mengklik peta ... apakah ada cara lain untuk melihat apakah string tertentu ada dalam array?

uji
sumber

Jawaban:

247

Coba ini:

if(blockedTile.indexOf("118") != -1)
{  
   // element found
}
Bala R
sumber
24
Ini tidak berfungsi untuk browser lama (seperti IE <9). Ada fungsi jQuery untuk ini: api.jquery.com/jQuery.inArray
Vinicius Pinto
5
Cara yang lebih cepat adalah membalikkan bit dengan bijak if(!!~blockedTile.indexOf('118))metode ini akan selalu mengembalikan nilai true jika hasilnya> -1 dan false jika hasil === -1
bm_i
11
@ bm_i Mana yang lebih cepat ? Lebih cepat mengetik?
alex
1
indexOf()dapat juga diterapkan pada array literal, mis if (-1 == [84, 116].indexOf(event.keyCode)). Diuji pada Chrome 37.0.2062.122.
François
2
Saya selalu menggunakan fwiw indexOf(…) >= 0. tidak ada bedanya dan saya lupa di mana saya mengambilnya sebagai kebiasaan
JSDBroughton
49

Seperti disebutkan sebelumnya, jika browser Anda mendukung indexOf(), hebat! Jika tidak, Anda perlu pollyfil atau mengandalkan sabuk utilitas seperti lodash / garis bawah .

Hanya ingin menambahkan tambahan ES2016 yang lebih baru ini (untuk menjaga pertanyaan ini diperbarui):

Array.prototype.includes ()

if (blockedTile.includes("118")) {
    // found element
}
Kutyel
sumber
12
function in_array(needle, haystack){
    var found = 0;
    for (var i=0, len=haystack.length;i<len;i++) {
        if (haystack[i] == needle) return i;
            found++;
    }
    return -1;
}
if(in_array("118",array)!= -1){
//is in array
}
ndhanhse
sumber
2
OP tidak ingin loop
JNF
12

Gunakan Underscore.js

Ini lintas-browser yang sesuai dan dapat melakukan pencarian biner jika data Anda diurutkan.

_.Indeks

_.indexOf (array, value, [isSorted]) Mengembalikan indeks di mana nilai dapat ditemukan dalam array, atau -1 jika nilainya tidak ada dalam array. Menggunakan fungsi indexOf asli kecuali tidak ada. Jika Anda bekerja dengan array besar, dan Anda tahu bahwa array sudah diurutkan, berikan true untuk isSorted untuk menggunakan pencarian biner yang lebih cepat.

Contoh

//Tell underscore your data is sorted (Binary Search)
if(_.indexOf(['2','3','4','5','6'], '4', true) != -1){
    alert('true');
}else{
    alert('false');   
}

//Unsorted data works to!
if(_.indexOf([2,3,6,9,5], 9) != -1){
    alert('true');
}else{
    alert('false');   
}
Brandon Boone
sumber
11

Beberapa browser mendukung Array.indexOf().

Jika tidak, Anda dapat menambah Arrayobjek melalui prototipe seperti ...

if (!Array.prototype.indexOf)
{
  Array.prototype.indexOf = function(searchElement /*, fromIndex */)
  {
    "use strict";

    if (this === void 0 || this === null)
      throw new TypeError();

    var t = Object(this);
    var len = t.length >>> 0;
    if (len === 0)
      return -1;

    var n = 0;
    if (arguments.length > 0)
    {
      n = Number(arguments[1]);
      if (n !== n) // shortcut for verifying if it's NaN
        n = 0;
      else if (n !== 0 && n !== (1 / 0) && n !== -(1 / 0))
        n = (n > 0 || -1) * Math.floor(Math.abs(n));
    }

    if (n >= len)
      return -1;

    var k = n >= 0
          ? n
          : Math.max(len - Math.abs(n), 0);

    for (; k < len; k++)
    {
      if (k in t && t[k] === searchElement)
        return k;
    }
    return -1;
  };
}

Sumber .

alex
sumber
tidak bisakah kita menggunakan ('118' di BlockTile) dalam javascript?
prabhat mishra
1
@prabhatmishra Itu hanya bisa memeriksa kunci.
alex
9

Gunakan saja sesuai selera Anda:

var blockedTile = [118, 67, 190, 43, 135, 520];

// includes (js)

if ( blockedTile.includes(118) ){
    console.log('Found with "includes"');
}

// indexOf (js)

if ( blockedTile.indexOf(67) !== -1 ){
    console.log('Found with "indexOf"');
}

// _.indexOf (Underscore library)

if ( _.indexOf(blockedTile, 43, true) ){
    console.log('Found with Underscore library "_.indexOf"');
}

// $.inArray (jQuery library)

if ( $.inArray(190, blockedTile) !== -1 ){
    console.log('Found with jQuery library "$.inArray"');
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

Сергей Савельев
sumber
6
if(array.indexOf("67") != -1) // is in array
Marty
sumber
6

Cara terbaik untuk melakukannya pada 2019 adalah dengan menggunakan .includes()

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

Parameter pertama adalah apa yang Anda cari. Parameter kedua adalah posisi indeks dalam array ini untuk memulai pencarian.

Jika Anda perlu melakukan crossbrowsy di sini - ada banyak jawaban lama.

Alex Under
sumber
1
The includessolusi diduplikasi di Kutyel (2016), Сергей Савельев (2017) dan Krunal Limbad (2018) jawaban dengan contoh-contoh yang sama rinci dan referensi ...
CPHPython
4

Sudah dijawab di atas tetapi ingin berbagi.

Tidak akan bekerja di IE sekalipun. terima kasih telah menyebutkannya @Mahmoud

var array1 = [1, 2, 3];

console.log(array1.includes(2));
// expected output: true

var pets = ['cat', 'dog', 'bat'];

console.log(pets.includes('cat'));
// expected output: true

console.log(pets.includes('at'));
// expected output: false

mendapat beberapa referensi Di Sini . mereka juga memiliki Polyfill untuk di atas.

Krunal Limbad
sumber
Hati-hati saat Anda menggunakan ini. Array.includes()diperkenalkan di ES7 (ECMAScript 2017) dan tidak akan berfungsi dengan browser lama. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
uxcode
3

Bergantung pada versi JavaScript yang Anda miliki, Anda dapat menggunakan indexOf:

Mengembalikan indeks pertama di mana elemen yang diberikan dapat ditemukan dalam array, atau -1 jika tidak ada.

Atau some:

Menguji apakah beberapa elemen dalam array melewati pengujian yang dilaksanakan oleh fungsi yang disediakan.

Tetapi, jika Anda melakukan semacam ini, periksa banyak, Anda akan lebih baik menggunakan Objek untuk menyimpan string Anda (atau mungkin objek serta Array tergantung pada apa yang Anda lakukan dengan data Anda).

mu terlalu pendek
sumber
3

Saya akan menggunakan struktur data yang berbeda, karena array tampaknya bukan solusi terbaik.

Alih-alih array, gunakan objek sebagai tabel-hash, seperti:

(diposting juga di jsbin )

var arr = ["x", "y", "z"];
var map = {};
for (var k=0; k < arr.length; ++k) {
  map[arr[k]] = true;
}

function is_in_map(key) {
  try {
    return map[key] === true;
  } catch (e) {
    return false;
  }
}


function print_check(key) {
  console.log(key + " exists? - " + (is_in_map(key) ? "yes" : "no"));
}

print_check("x");
print_check("a");

Output konsol:

x exists? - yes
a exists? - no

Itu solusi lurus ke depan. Jika Anda lebih menyukai pendekatan berorientasi objek, maka cari "js hashtable" di Google .

Ron Klein
sumber
3

IMHO paling kompatibel dengan browser lama

Array.prototype.inArray = function( needle ){

    return Array(this).join(",").indexOf(needle) >-1;

}

var foods = ["Cheese","Onion","Pickle","Ham"];
test = foods.inArray("Lemon");
console.log( "Lemon is " + (test ? "" : "not ") + "in the list." );

Dengan memutar salinan Array ke string CSV, Anda dapat menguji string di browser yang lebih lama.

Mark Giblin
sumber
3
ini akan salah positif jika salah satu anggota array berisi jarum tetapi tidak secara eksklusif. misalnya ['Lemon Pie'].inArray('Lemon')akan kembali True. Anda dapat membungkus jarum dengan ,untuk mengelilinginya atau menggunakan pencocokan regex untuk melakukan hal yang sama tetapi bergabung akan lebih disukai menggunakan sesuatu yang lebih tidak jelas daripada ,untuk alasan positif palsu yang sama ( |katakanlah). Itu tergantung pada dataset
JSDBroughton
1

Mengapa Anda tidak menggunakan Array.filter?

var array = ['x','y','z'];
array.filter(function(item,index,array){return(item==YOURVAL)}).

Cukup salin ke kode Anda, dan ini dia:

Array.prototype.inArray = function (searchedVal) {
return this.filter(function(item,index,array){return(item==searchedVal)}).length==true
}
Nikita Yegorov
sumber
0

dalam contoh array, Sama dalam php (in_array)

 var ur_fit = ["slim_fit", "tailored", "comfort"];
 var ur_length = ["length_short", "length_regular", "length_high"];
    if(ur_fit.indexOf(data_this)!=-1){
        alert("Value is avail in ur_fit array");
    }
    else if(ur_length.indexOf(data_this)!=-1){      
         alert("value is avail in ur_legth array"); 

    }
Avinash Raut
sumber
0
var myArray = [2,5,6,7,9,6];
myArray.includes(2) // is true
myArray.includes(14) // is false
kaboome
sumber
4
Posting sepotong kode BUKAN jawaban, Anda harus menambahkan penjelasan di atas itu.
xoxel
1
Meskipun potongan kode ini dapat menyelesaikan masalah, itu tidak menjelaskan mengapa atau bagaimana ia menjawab pertanyaan. Harap sertakan penjelasan untuk kode Anda , karena itu sangat membantu untuk meningkatkan kualitas posting Anda. Ingatlah bahwa Anda menjawab pertanyaan untuk pembaca di masa depan, dan orang-orang itu mungkin tidak tahu alasan untuk saran kode Anda. Penanda / pengulas: Untuk jawaban hanya kode seperti ini, downvote, jangan hapus!
Luca Kiebel
Sudah ada beberapa jawaban yang menyarankan untuk digunakan includes. Bagaimana jawaban ini memberikan nilai tambahan apa pun dibandingkan dengan mereka?
Boghyon Hoffmann
0

Anda dapat mencoba kode di bawah ini. Periksa http://api.jquery.com/jquery.grep/

var blockedTile = new Array("118", "67", "190", "43", "135", "520");
var searchNumber = "11878";
arr = jQuery.grep(blockedTile, function( i ) {
  return i === searchNumber;
});
if(arr.length){ console.log('Present'); }else{ console.log('Not Present'); }

periksa arr.length jika lebih dari 0 berarti string ada atau tidak.

Prasad Wargad
sumber
-2

Saya pikir cara paling sederhana adalah:

(118 in blockedTile); //is true 
Cristian Mecozzi
sumber