2010-12-29 4 views
16

J'essaie d'utiliser inarray mais c'est toujours vrai? Des idées? (Tous de li montrent des)jQuery .inArray() toujours vrai?

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

Répondre

50

Vous devez faire ceci:

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

ou ceci:

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

The $.inArray() method retourne l'index de base 0 de l'élément. S'il n'y a pas d'élément, il renvoie -1, que l'instruction if() considérera comme true.

De la documentation:

Parce que JavaScript traite 0 comme vaguement égal à faux, si nous vérifions la présence de valeur dans array (soit 0 == false, mais 0 == false!) , nous devons vérifier si ce n'est pas égal à (ou supérieur à) -1.


EDIT: Au lieu de pousser les deux valeurs dans le tableau comme un objet, il suffit d'utiliser l'un ou l'autre, de sorte que vous avez un tableau de chaînes à partir de laquelle vous pouvez construire un sélecteur multiple.

Une façon est comme ceci:

// 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 le tableau ressemble à:

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

Le sélecteur résultant ressemblera:

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

Hummm? maintenant aucun d'eux ne montre? –

+0

Voici la liste de sélection ...

+0

@Charles: Ceci est dû au fait que le tableau' arrVals' ne contient pas '' Army'' ou '' Aqua'', mais contient un objet où soit le 'key' ou' value' (pas sûr lequel) a la chaîne que vous voulez. – user113716

0

ES6 à la rescousse! Bien que jQuery je pensais que la peine de répondre pour les futurs lecteurs ...

ES6 présente .includes() qui fonctionne comme vous pensez $.inArray devrait fonctionner:

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

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

Array.prototype.includes()