jQuery.inArray (), как правильно его использовать?

345

Впервые работаю с jQuery.inArray() и это выглядит странно.

Если объект находится в массиве, он вернет 0, но 0 является ложным в Javascript. Таким образом, будет выведено следующее: «НЕ в массиве»

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

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

Мне придется изменить оператор if на:

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

Но это делает код нечитаемым. Особенно для тех, кто не знает эту функцию. Они ожидают, что jQuery.inArray («test», myarray) выдает true, когда «test» находится в массиве.

Итак, мой вопрос, почему это делается так? Я действительно не люблю это. Но должна быть веская причина, чтобы сделать это так.

NBAR
источник

Ответы:

735

inArrayвозвращает индекс элемента в массиве, а не логическое значение, указывающее, существует ли элемент в массиве. Если элемент не был найден, -1будет возвращен.

Итак, чтобы проверить, есть ли элемент в массиве, используйте:

if(jQuery.inArray("test", myarray) !== -1)
Деннис
источник
16
CoffeeScript:if jQuery.inArray('test', myarray) isn't -1
Джошуа Пинтер
9
Конечно, вы всегда можете определить свою собственную, более интуитивную функцию, как$.isInArray = function(test,array) { return $.inArray(test, array) !== -1; };
Уэсли Смит
1
Или короче: $.isInArray = function(item, array) { return !!~$.inArray(item, array); };(Я бы держал такой загадочный код в хорошо названной функции, чтобы сохранить намерение, хотя :))
Деннис
2
Спасибо @ Chips_100 за то, что показали нам визуальные ученики, как это сделать правильно, было бы неплохо, если бы jQuery мог обновить это, чтобы включить это в свой собственный пример.
asherrard
2
Вы также можете использоватьif( $.inArray(test, array) > -1) { // do stuff }
MistyDawn
48

$.inArrayвозвращает индекс элемента, если он найден, или -1, если это не так - не логическое значение. Так что правильно

if(jQuery.inArray("test", myarray) != -1) {
    console.log("is in array");
} else {
    console.log("is NOT in array");
} 
Джон
источник
26

Ответ приходит из первого параграфа проверки документации, если результаты больше -1, а не если это правда или ложь.

Метод $ .inArray () похож на нативный метод JavaScript .indexOf () в том смысле, что он возвращает -1, если не находит соответствия. Если первый элемент в массиве соответствует значению, $ .inArray () возвращает 0.

Поскольку JavaScript обрабатывает 0 как свободно равный false (то есть 0 == false, но 0! == false), если мы проверяем наличие значения в массиве, нам нужно проверить, не равно ли оно (или больше, чем ) -1.

Пэтси Исса
источник
23

Правильный способ использования inArray(x, arr)- не использовать его вообще , а использовать вместо этого arr.indexOf(x).

Официальное стандартное имя также более ясно на тот факт, что возвращаемое значение является индексом, поэтому, если переданный элемент является первым, который вы получите обратно 0(это неверно в Javascript).

(Обратите внимание, что arr.indexOf(x)это не поддерживается в Internet Explorer до IE9 , поэтому, если вам нужно поддерживать IE8 и более ранние версии, это не будет работать, и функция jQuery является лучшей альтернативой.)

6502
источник
1
Я должен согласиться. Название inArray сбивает с толку. Кажется, он должен возвращать логическое значение, но он делает то же самое, что indexOf
Энрике Морено Палатка
Каждый раз, когда я $.inArrayиспользовал в начале какой-то код, мне приходилось исправлять ошибку, я стону. Во всяком случае, это должен быть принятый ответ.
Алуан Хаддад
11

Или, если вы хотите получить немного фантазии, вы можете использовать побитовые операторы not (~) и логические not (!) Для преобразования результата функции inArray в логическое значение.

if(!!~jQuery.inArray("test", myarray)) {
    console.log("is in array");
} else {
    console.log("is NOT in array");
}
Джейсон
источник
4
Использование побитовых операторов обычно запрещено / осуждается в общих стандартах кодирования JavaScript. Так что, если вы используете линтер (jshint, eslint и т. Д.), Есть вероятность, что вы не получите этого через анализ кода. Решение работает, хотя.
jhrr
8

Я обычно использую

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

или

if(jQuery.inArray("test", myarray) >= 0)
DDan
источник
3
Еще лучше ...if( $.inArray("test", myarray) > -1 )
MistyDawn
8

Метод jQuery inArray () используется для поиска значения в массиве и возврата его индекса, а не логического значения. И если значение не было найдено, оно вернет -1.

Таким образом, чтобы проверить, присутствует ли значение в массиве, выполните следующую практику:

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

    alert("found");
}

Ссылка

Хасан Амир Хан
источник
7

inArrayФункция возвращает индекс объекта , подаваемый в качестве первого аргумента функции в массиве , подаваемый в качестве второго аргумента функции.

Когда inArrayвозвращается, 0это означает, что первый аргумент был найден в первой позиции предоставленного массива.

Для использования inArrayв операторе if используйте:

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

inArrayвозвращает, -1когда первый аргумент, переданный функции, не найден в массиве, переданном в качестве второго аргумента.

Кевин Бауэрсокс
источник
5

вместо использования jQuery.inArray()вы также можете использовать includesметод для массива 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

проверьте официальный пост здесь

Саураб Соланки
источник
1
IE не поддерживает include
anoldermark
3

jQuery.inArray () возвращает индекс элемента в массиве или -1, если элемент не был найден. Узнайте больше здесь: jQuery.inArray ()

Darvex
источник
3

Он вернет индекс элемента в массиве. Если он не найден, вы получите-1

Johan
источник
3

Если мы хотим проверить, что элемент находится внутри набора элементов, мы можем сделать, например:

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

Это полезно для проверки динамических переменных. Этот метод легко читается.

Сергей Савельев
источник
2

$.inArray()выполняет ТОЧНУЮ ЖЕ ВЕЩЬ как myarray.indexOf()и возвращает индекс элемента, для которого проверяется массив, на наличие. Это просто совместимо с более ранними версиями IE до IE9. Наилучшим выбором, вероятно, является использование, myarray.includes()которое возвращает логическое значение true / false. Смотрите фрагмент кода ниже для примеров вывода всех 3 методов.

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

MistyDawn
источник
Следует отметить, что это $.inArrayдолжен быть золотой стандарт, если у вас есть доступ к библиотеке jQuery. В противном случае .indexOfвместо этого следует использовать JavaScript с полифилом для IE8. Держитесь подальше от таких современных вещей, как .includes().
Александр Диксон
1

Чувак, проверь док .

например:

var arr = [ 4, "Pete", 8, "John" ];
console.log(jQuery.inArray( "John", arr ) == 3);
Альберто Черкейра
источник
1

По какой-то причине, когда вы пытаетесь проверить DOM-элемент jquery, он не будет работать должным образом. Таким образом, переписав функцию, добьемся цели:

function isObjectInArray(array,obj){
    for(var i = 0; i < array.length; i++) {
        if($(obj).is(array[i])) {
            return i;
        }
    }
    return -1;
}
Joeneter10
источник
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>

abhinavxeon
источник
0

Просто никто не использует $вместо jQuery:

if ($.inArray(nearest.node.name, array)>=0){
   console.log("is in array");
}else{
   console.log("is not in array");
}
Уильям Ху
источник
Мне просто интересно, почему? Есть ли какие-то необычные проблемы совместимости, которые это вызывает? У меня никогда не было проблем с использованием $вместо jQuery.
MistyDawn
0

самый короткий и простой способ.

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

if(arrayHere[any key want to search])   
   console.log("yes found in array");
Мухаммед Амир Шахзад
источник