2010-12-29 5 views
16

Я пытаюсь использовать inarray, но всегда возвращается true? Есть идеи? (Все Ли показываете)jQuery .inArray() всегда верно?

$("#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(); 
    }; 

ответ

50

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

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

или это:

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

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

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

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


EDIT: Вместо того, толкая оба значения в массив в качестве объекта, просто использовать один или другой, так что у вас есть массив строк, из которых можно построить несколько селектор.

Один из способов, как это:

// 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(); 
+0

Hummm? теперь никто из них не показывает? –

+0

вот список выбора ...

+0

@Charles: Это потому, что массив' arrVals' не содержит '' Army'' или '' Aqua'', но вместо этого содержит объект где либо «ключ», либо «значение» (не уверен, что) имеет нужную строку. – user113716

0

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

ES6 вводит .includes(), который работает, как вы думаете $.inArray должны работать:

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

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

Array.prototype.includes()

Смежные вопросы