2010-12-29 7 views
16

Estoy tratando de usar inarray pero siempre es cierto? ¿Algunas ideas? (Todo de Li están mostrando)jQuery .inArray() siempre es cierto?

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

Respuesta

50

Es necesario hacer esto:

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

o esto:

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

The $.inArray() method devuelve el índice de base 0 del artículo. Si no hay ningún artículo, devuelve -1, que la declaración if() considerará como true.

A partir de los documentos:

Debido JavaScript trata a 0 tan libremente igual a falsa, si estamos comprobando la presencia de valor dentro de la matriz (es decir, 0 == false, pero 0 == false!) , necesitamos verificar si no es igual a (o mayor que) -1.


EDIT: En lugar de empujar ambos valores en la matriz como un objeto, sólo tiene que utilizar uno o el otro, por lo que tiene una matriz de cadenas a partir del cual se puede construir un selector múltiple.

Una forma es la siguiente:

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

Si la matriz se ve así:

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

El selector resultante se parecerá a:

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

Hummm? ahora ninguno de ellos está mostrando? –

+0

aquí está la lista de selección ...

+0

@Charles: Esto se debe a que la matriz' arrVals' no contiene ''Army'' or'' Aqua'', sino que contiene un objeto donde ya sea la 'clave' o 'valor' (no estoy seguro de cuál) tiene la cadena que desea. – user113716

0

ES6 al rescate! Aunque no jQuery pensé vale la pena responder a futuros lectores ...

ES6 introduce .includes() que funciona como usted piensa $.inArray debería funcionar:

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

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

Array.prototype.includes()

Cuestiones relacionadas