jQuery.inArray (), bagaimana menggunakannya dengan benar?


345

Pertama kali saya bekerja dengan jQuery.inArray()dan itu bertindak agak aneh.

Jika objek dalam array, itu akan mengembalikan 0, tetapi 0 salah dalam Javascript. Jadi yang berikut ini akan menampilkan: "BUKAN dalam susunan"

var myarray = [];
myarray.push("test");

if(jQuery.inArray("test", myarray)) {
    console.log("is in array");
} else {
    console.log("is NOT in array");
}

Saya harus mengubah pernyataan if ke:

if(jQuery.inArray("test", myarray)==0)

Tapi ini membuat kode tidak terbaca. Terutama bagi seseorang yang tidak tahu fungsi ini. Mereka akan berharap bahwa jQuery.inArray ("test", myarray) memberikan true ketika "test" ada dalam array.

Jadi pertanyaan saya adalah, mengapa dilakukan seperti ini? Saya benar-benar tidak suka ini. Tapi pasti ada alasan bagus untuk melakukannya seperti itu.

Jawaban:


734

inArraymengembalikan indeks elemen dalam array, bukan boolean yang menunjukkan jika item ada dalam array. Jika elemen tidak ditemukan, -1akan dikembalikan.

Jadi, untuk memeriksa apakah suatu item ada dalam array, gunakan:

if(jQuery.inArray("test", myarray) !== -1)

16
CoffeeScript:if jQuery.inArray('test', myarray) isn't -1
Joshua Pinter

9
Tentu saja, Anda selalu bisa mendefinisikan sendiri, lebih intuitif, fungsi seperti$.isInArray = function(test,array) { return $.inArray(test, array) !== -1; };
Wesley Smith

1
Atau lebih pendek: $.isInArray = function(item, array) { return !!~$.inArray(item, array); };(Saya akan menyimpan kode samar seperti itu dalam fungsi yang bernama baik untuk menjaga niat tetap jelas :))
Dennis

2
Terima kasih @ Chips_100 untuk menunjukkan kepada kami pelajar visual bagaimana melakukannya dengan benar, alangkah baiknya jika jQuery dapat memperbarui untuk memasukkannya dalam contoh mereka sendiri.
asherrard

2
Anda juga dapat menggunakanif( $.inArray(test, array) > -1) { // do stuff }
MistyDawn

48

$.inArraymengembalikan indeks elemen jika ditemukan atau -1 jika tidak - bukan nilai boolean. Jadi yang benar adalah

if(jQuery.inArray("test", myarray) != -1) {
    console.log("is in array");
} else {
    console.log("is NOT in array");
} 

26

Jawabannya berasal dari paragraf pertama dari dokumentasi yang memeriksa apakah hasilnya lebih besar dari -1, bukan apakah itu benar atau salah.

Metode $ .inArray () mirip dengan metode .indexOf () asli JavaScript yang mengembalikan -1 ketika tidak menemukan kecocokan. Jika elemen pertama dalam array cocok dengan nilai, $ .inArray () mengembalikan 0.

Karena JavaScript memperlakukan 0 sebagai longgar sama dengan false (yaitu 0 == salah, tetapi 0! == salah), jika kita memeriksa keberadaan nilai dalam array, kita perlu memeriksa apakah itu tidak sama dengan (atau lebih besar dari ) -1.


23

Cara penggunaan yang benar inArray(x, arr)adalah tidak menggunakannya sama sekali , dan sebaliknya menggunakannya arr.indexOf(x).

Nama standar resmi juga lebih jelas pada kenyataan bahwa nilai yang dikembalikan adalah indeks sehingga jika elemen yang dilewati adalah yang pertama Anda akan mendapatkan kembali 0(yang salah dalam Javascript).

(Perhatikan bahwa arr.indexOf(x)ini tidak didukung di Internet Explorer sampai IE9 , jadi jika Anda perlu untuk mendukung IE8 dan sebelumnya, ini tidak akan bekerja, dan fungsi jQuery adalah alternatif yang lebih baik.)


1
Saya harus setuju. Nama inArray membingungkan. Tampaknya itu harus mengembalikan boolean, tetapi tidak persis sama dengan indexOf
Enrique Moreno Tent

Setiap kali saya $.inArraymenggunakan di awal beberapa kode saya harus memperbaiki bug, saya mengeluh. Bagaimanapun, ini harus menjadi jawaban yang diterima.
Aluan Haddad

11

Atau jika Anda ingin mendapatkan bit fancy Anda dapat menggunakan operator bitwise not (~) dan logical not (!) Untuk mengonversi hasil fungsi inArray ke nilai boolean.

if(!!~jQuery.inArray("test", myarray)) {
    console.log("is in array");
} else {
    console.log("is NOT in array");
}

4
Penggunaan operator bitwise umumnya dilarang / disukai dalam standar pengkodean JavaScript umum. Jadi jika Anda menggunakan linter (jshint, eslint dll.) Kemungkinan Anda tidak akan mendapatkan ini melalui tinjauan kode. Solusi berfungsi.
jhrr

8

Saya biasanya menggunakan

if(!(jQuery.inArray("test", myarray) < 0))

atau

if(jQuery.inArray("test", myarray) >= 0)

3
Bahkan lebih baik ...if( $.inArray("test", myarray) > -1 )
MistyDawn

8

Metode jQuery inArray () digunakan untuk mencari nilai dalam array dan mengembalikan indeksnya bukan nilai Boolean. Dan jika nilainya tidak ditemukan maka akan mengembalikan -1.

Jadi, untuk memeriksa apakah suatu nilai hadir dalam array, ikuti praktik berikut ini:

myArray = new Array("php", "tutor");
if( $.inArray("php", myArray) !== -1 ) {

    alert("found");
}

Referensi


7

Itu inArray fungsi mengembalikan indeks dari objek yang disediakan sebagai argumen pertama ke fungsi dalam array disediakan sebagai argumen kedua ke fungsi.

Ketika inArraykembali0 itu menunjukkan bahwa argumen pertama ditemukan di posisi pertama dari array yang disediakan.

Untuk digunakan inArraydalam pernyataan if gunakan:

if(jQuery.inArray("test", myarray) != -1) {
    console.log("is in array");
} else {
    console.log("is NOT in array");
}

inArraykembali -1ketika argumen pertama yang diteruskan ke fungsi tidak ditemukan dalam array yang diteruskan sebagai argumen kedua.


5

alih-alih menggunakan jQuery.inArray()Anda juga dapat menggunakan includesmetode untuk array int:

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

periksa pos resmi di sini


1
termasuk tidak didukung oleh IE - :: use indeOf
anoldermark


3

Ini akan mengembalikan indeks item dalam array. Jika tidak ditemukan Anda akan mendapatkannya-1


3

Jika kita ingin memeriksa elemen di dalam set elemen yang bisa kita lakukan misalnya:

var checkboxes_checked = $('input[type="checkbox"]:checked');

// Whenever a checkbox or input text is changed
$('input[type="checkbox"], input[type="text"]').change(function() {
    // Checking if the element was an already checked checkbox
    if($.inArray( $(this)[0], checkboxes_checked) !== -1) {
        alert('this checkbox was already checked');
    }
}

2
/^(one|two|tree)$/i.test(field) // field = Two; // true
/^(one|two|tree)$/i.test(field) // field = six; // false
/^(раз|два|три)$/ui.test(field) // field = Три; // true

Ini berguna untuk memeriksa variabel dinamis. Metode ini mudah dibaca.


2

$.inArray()apakah EXACT SAMA HAL sebagai myarray.indexOf()dan mengembalikan indeks item yang Anda periksa array untuk keberadaan. Itu hanya kompatibel dengan versi IE sebelum IE9 sebelumnya. Pilihan terbaik mungkin adalah menggunakan myarray.includes()yang mengembalikan nilai true / false boolean. Lihat cuplikan di bawah ini untuk contoh-contoh keluaran dari ketiga metode.

// Declare the array and define it's values
var myarray = ['Cat', 'Dog', 'Fish'];

// Display the return value of each jQuery function 
// when a radio button is selected
$('input:radio').change( function() {

  // Get the value of the selected radio
  var selectedItem = $('input:radio[name=arrayItems]:checked').val();
  $('.item').text( selectedItem );
  
  // Calculate and display the index of the selected item
  $('#indexVal').text( myarray.indexOf(selectedItem) );
  
  // Calculate and display the $.inArray() value for the selected item
  $('#inArrVal').text( $.inArray(selectedItem, myarray) );
  
  // Calculate and display the .includes value for the selected item
  $('#includeVal').text( myarray.includes(selectedItem) );
});
#results { line-height: 1.8em; }
#resultLabels { width: 14em; display: inline-block; margin-left: 10px; float: left; }
label { margin-right: 1.5em; }
.space { margin-right: 1.5em; }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

Click a radio button to display the output of
&nbsp;<code>$.inArray()</code>
&nbsp;vs. <code>myArray.indexOf()</code>
&nbsp;vs. <code>myarray.includes()</code>
&nbsp;when tested against
&nbsp;<code>myarray = ['Cat', 'Dog', 'Fish'];</code><br><br>

<label><input type="radio" name="arrayItems" value="Cat"> Cat</label>
<label><input type="radio" name="arrayItems" value="Dog"> Dog</label>
<label><input type="radio" name="arrayItems" value="Fish"> Fish</label>  
<label><input type="radio" name="arrayItems" value="N/A"> ← Not in Array</label>
<br><br>

<div id="results">
  <strong>Results:</strong><br>
  <div id="resultLabels">
    myarray.indexOf( "<span class="item">item</span>" )<br>
    $.inArray( "<span class="item">item</span>", myarray )<br>
    myarray.includes( "<span class="item">item</span>" )
  </div>
  <div id="resultOutputs">
    <span class="space">=</span><span id="indexVal"></span><br>
    <span class="space">=</span><span id="inArrVal"></span><br>
    <span class="space">=</span><span id="includeVal"></span>
  </div>
 </div>


Perlu dicatat bahwa $.inArrayharus menjadi standar emas jika Anda memiliki akses ke perpustakaan jQuery. Jika tidak, JavaScript .indexOfdengan polyfill untuk IE8 harus digunakan sebagai gantinya. Jauhi barang-barang modern seperti .includes().
Alexander Dixon

1

***, periksa dok .

sebagai contoh:

var arr = [ 4, "Pete", 8, "John" ];
console.log(jQuery.inArray( "John", arr ) == 3);

1

Untuk beberapa alasan ketika Anda mencoba memeriksa elemen DOM jquery itu tidak akan berfungsi dengan baik. Jadi menulis ulang fungsi akan melakukan trik:

function isObjectInArray(array,obj){
    for(var i = 0; i < array.length; i++) {
        if($(obj).is(array[i])) {
            return i;
        }
    }
    return -1;
}

1

var abc = {
      "partner": {
        "name": "North East & Cumbria (EDT)",
        "number": "01915008717",
        "areas": {
        "authority": ["Allerdale", "Barrow-in-Furness", "Carlisle"]
        }
      }
    };
    
    
    $.each(abc.partner.areas, function(key, val){
     console.log(val);
      if(jQuery.inArray("Carlisle", val)) {
        console.log(abc.partner.number);
    }
    });
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>


0

Hanya tidak ada yang menggunakan, $bukan jQuery:

if ($.inArray(nearest.node.name, array)>=0){
   console.log("is in array");
}else{
   console.log("is not in array");
}

Saya hanya ingin tahu mengapa? Apakah ada masalah kompatibilitas yang tidak biasa yang disebabkan oleh hal ini? Saya tidak pernah mengalami masalah apa pun dengan menggunakan $alih - alih jQuery.
MistyDawn
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.