jQuery.inArray (), nasıl doğru kullanılır?


345

İlk kez çalıştığımda jQuery.inArray()biraz garip davranıyor.

Nesne dizideyse, 0 döndürür, ancak Javascript'te 0 yanlıştır. Böylece aşağıdakiler çıkacaktır: "dizide DEĞİL"

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

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

İf ifadesini şu şekilde değiştirmem gerekecek:

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

Ancak bu, kodu okunamaz hale getirir. Özellikle bu işlevi bilmeyen biri için. Dizide "test" olduğunda jQuery.inArray ("test", myarray) işlevinin doğru olmasını beklerler.

Benim sorum şu, neden bu şekilde yapılıyor? Gerçekten bundan hoşlanmıyorum. Ancak bunu yapmak için iyi bir neden olmalı.

Yanıtlar:


734

inArrayöğenin dizide olup olmadığını gösteren bir boole değeri değil, dizideki öğenin dizinini döndürür. Öğe bulunamadığı -1takdirde iade edilir.

Bu nedenle, bir öğenin dizide olup olmadığını kontrol etmek için şunu kullanın:

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

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

9
Tabii ki, her zaman kendi, daha sezgisel, fonksiyonunuzu tanımlayabilirsiniz$.isInArray = function(test,array) { return $.inArray(test, array) !== -1; };
Wesley Smith

1
Ya da daha kısa: $.isInArray = function(item, array) { return !!~$.inArray(item, array); };(Niyeti açık tutmak için iyi adlandırılmış bir fonksiyonda böyle şifreli kod tutacağım :))
Dennis

2
Bize görsel öğrencilere doğru şekilde nasıl yapılacağını gösterdiğin için Chips_100'e teşekkürler.
asherrard

2
Ayrıca kullanabilirsinizif( $.inArray(test, array) > -1) { // do stuff }
MistyDawn

48

$.inArrayeğer bulunursa öğenin dizinini , yoksa boolean değerini değil -1 değerini döndürür . Yani doğru

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

26

Yanıt, belgelerin doğru veya yanlış olması durumunda değil, sonuçların -1'den büyük olup olmadığının ilk paragrafından gelir.

$ .İnArray () yöntemi, bir eşleşme bulamadığında -1 döndürmesi nedeniyle JavaScript'in yerel .indexOf () yöntemine benzer. Dizideki ilk öğe değerle eşleşirse, $ .inArray () işlevi 0 değerini döndürür.

JavaScript 0'a false değerine gevşek olarak davrandığından (yani 0 == false, ancak 0! == false), dizi içindeki değerin varlığını kontrol edersek, değerin eşit olup olmadığını (veya ) -1.


23

Kullanmanın doğru yolu inArray(x, arr)olduğunu hiç kullanmadığınız ve bunun yerine kullanarak arr.indexOf(x).

Resmi standart isim, döndürülen değerin bir indeks olduğu gerçeği üzerinde daha açıktır, bu nedenle geçirilen öğe ilk ise, geri alırsınız 0(Javascript'te falsy).

(Not arr.indexOf(x)edilir IE9 kadar Internet Explorer desteklenmez , bu nedenle daha önce IE8 desteklemek ve gerekiyorsa, bu olmaz eser ve jQuery işlevi daha iyi bir alternatiftir.)


1
Katılıyorum. İnArray'ın adı kafa karıştırıcı. Bir boole döndürmesi gerekiyor gibi görünüyor, ancak indexOf ile tam olarak aynı
Enrique Moreno Tent

Everytime $.inArrayben bir hata düzeltmek gitmek zorunda bazı kod başında kullanılan, Ben inilti. Her neyse, bu kabul edilen cevap olmalı.
Aluan Haddad

11

Ya da biraz süslü olmak istiyorsanız, inArray işlevinin sonucunu bir boole değerine dönüştürmek için bitwise not (~) ve mantıksal değil (!) Operatörlerini kullanabilirsiniz.

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

4
Bitsel operatörlerin kullanımı genel JavaScript kodlama standartlarında genellikle yasaklanmıştır. Eğer bir linter (jshint, eslint vb.) Şansı kullanıyorsanız, bu kod inceleme yoluyla elde olmaz. Çözüm işe yarıyor.
jhrr

8

Genellikle kullanırım

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

veya

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

3
Daha da iyisi ...if( $.inArray("test", myarray) > -1 )
MistyDawn

8

jQuery inArray () yöntemi, bir dizideki bir değeri aramak ve Boole değerini değil dizinini döndürmek için kullanılır. Ve değer bulunamazsa -1 döndürür.

Bu nedenle, bir dizide bir değerin olup olmadığını kontrol etmek için aşağıdaki uygulamayı izleyin:

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

    alert("found");
}

Referans


7

inArrayİşlev, ikinci argüman olarak verilen dizideki işlevinin ilk argüman olarak verilen nesnenin dizinini döndürür.

Zaman inArraydöner 0ilk bağımsız değişken verilen dizinin ilk pozisyonda bulunan belirten bir.

Kullanmak için inArraybir if deyimi kullanımı içinde:

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

inArray-1işleve iletilen ilk argüman, ikinci argüman olarak iletilen dizide bulunamadığında döner .


5

kullanmak yerine int array için yöntemi jQuery.inArray()de kullanabilirsiniz includes:

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

resmi yazıyı buradan kontrol edin


1
içerir IE tarafından desteklenmez - :: use indeOf
anoldermark


3

Dizideki öğenin dizinini döndürür. Eğer bulamazsa, alacaksınız-1


3

Bir öğenin bir dizi öğenin içinde olup olmadığını kontrol etmek istiyorsak, örneğin yapabiliriz:

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

Bu, dinamik değişkenleri kontrol etmek için kullanışlıdır. Bu yöntemin okunması kolaydır.


2

$.inArray()yapar aynı şeyi olarak myarray.indexOf()ve varlığını dizi kontrol ediyoruz öğenin dizinini döndürür. IE9'dan önceki IE'nin önceki sürümleriyle uyumludur. En iyi seçim muhtemelen myarray.includes()boolean true / false değeri döndüren kullanmaktır . Tüm 3 yöntemin çıktı örnekleri için aşağıdaki snippet'e bakın.

// 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>


$.inArrayJQuery kütüphanesine erişiminiz varsa altın standart olması gerektiği unutulmamalıdır . Aksi takdirde, .indexOfIE8 için poli dolgulu JavaScript kullanılmalıdır. Gibi modern şeylerden uzak dur .includes().
Alexander Dixon


1

Bazı nedenlerden dolayı jquery DOM öğesini kontrol etmeye çalıştığınızda düzgün çalışmaz. Bu yüzden işlevi yeniden yazmak hile yapar:

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

Bunun $yerine hiç kimse kullanmaz jQuery:

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

Sadece nedenini merak ediyorum? Bunun neden olduğu nadir bir uyumluluk sorunu var mı? Onun $yerine kullanarak herhangi bir sorun yaşamadım jQuery.
MistyDawn

0

en kısa ve en basit yol.

arrayHere = ['cat1', 'dog2', 'bat3']; 

if(arrayHere[any key want to search])   
   console.log("yes found in array");
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.