Подтвердить что ты не робот

JQuery.inArray() всегда верно?

Я пытаюсь использовать inarray, но всегда возвращается true? Есть идеи? (все ли отображаются)

$("#select-by-color-list li").hide();

// get the select
var $dd = $('#product-variants-option-0');

if ($dd.length > 0) { // make sure we found the select we were looking for

    // save the selected value
    var selectedVal = $dd.val();

    // get the options and loop through them
    var $options = $('option', $dd);
    var arrVals = [];
    $options.each(function(){
        // push each option value and text into an array
        arrVals.push({
            val: $(this).val(),
            text: $(this).text()
        });
    });




};

//This is where it is returning true...


if($.inArray('Aqua', arrVals)) {
    $("#select-by-color-list li#aqua").show();
    };
    if($.inArray('Army', arrVals)) {
    $("#select-by-color-list li#army").show();
    };
4b9b3361

Ответ 1

Вам нужно сделать это:

if( $.inArray('Aqua', arrVals) > -1 ) {

или это:

if( $.inArray('Aqua', arrVals) !== -1 ) {

Метод $.inArray() возвращает индекс на основе 0 элемента. Если нет элемента, он возвращает -1, который оператор if() будет считать true.

Из документов:

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


РЕДАКТИРОВАТЬ: Вместо того, чтобы вставлять оба значения в массив как объект, просто используйте один или другой, так что у вас есть массив строк, из которого вы можете построить множественный селектор.

Один из способов:

  // Create an Array from the "value" or "text" of the select options
var arrVals = $.map( $dd[0].options, function( opt, i ){
    return opt.value || opt.text;
});

  // Build a multiple selector by doing a join() on the Array.
$( "#" + arrVals.join(',#') ).show();

Если массив выглядит так:

['Army','Aqua','Bread'];

Результирующий селектор будет выглядеть так:

$( "#Army,#Aqua,#Bread" ).show();

Ответ 2

ES6 на помощь! Хотя я не jQuery, я думал, что стоит отвечать будущим читателям...

ES6 вводит .includes(), который работает, как вы думаете, $.inArray СЛЕДУЕТ работать:

const myArray = ["a", "b", "c"];

console.log(myArray.includes("a")) /* true */
console.log(myArray.includes("d")) /* false */