2016-04-18 14 views
3

Ich benutze die array.protoype.filter method und es gibt ein leeres Array zurück.Javascript Filter leeres Array zurückgeben

function isSelected(value){ 

     var tagString = $(value).attr('class'); 
     $.each($(brandDrop.selections), function(index, brand) { 
     if(tagString.indexOf(brand) >= 0) { 
      console.log(tagString); 
      return tagString; 
     } 
     }); 

    } 

    var products = []; 
    $.each($('.products li'), function(index, product){ 
     products.push(product); 
    }); 

    var brandFiltered = products.filter(isSelected); 
    console.log(brandFiltered); 

Hier ist die Ausgabe der Konsole innerhalb der Schleife für tagstring und brandFiltered außerhalb der Schleife:

AugustaCollection,Crib,publishSK,simmons,simmons-kids,wood 
cribs:2058 BellanteCollection,Crib,publishSK,simmons-kids,wood 
cribs:2058 BelmontCollection,Crib,publishSK,simmons-kids,wood 
cribs:2082 [] 

Diese Funktion wird durch die Auswahl einer Checkbox ausgelöst wird. Was dieser Filter tun soll, ist ein Array von HTML-Elementen zu nehmen, ihr Klassenattribut auf das Vorhandensein eines ausgewählten Wertes zu überprüfen und nur die Klassennamen für die Elemente zurückzugeben, die die Filterkriterien erfüllen. Das Konsolenprotokoll in der Schleife zeigt die richtigen Elemente, aber aus irgendeinem Grund wird ein leeres Array außerhalb der Schleife zurückgegeben. Benutze ich die Filtermethode falsch?

+3

Ihre 'isSelected' Methode gibt nichts (' undefined') –

Antwort

2

Ihre return tagString; Zeile gibt ein Ergebnis an die $.each Funktion zurück, Ihre isSelected Funktion gibt derzeit nichts zurück.

Sie können diese Funktion bearbeiten, um eine Überprüfung durchzuführen und true zurückgeben, wenn die Zeichenfolge gefunden wird.

function isSelected(value){  
     var tagString = $(value).attr('class'); 
     var foundString = false; 
     $.each($(brandDrop.selections), function(index, brand) { 
     if(tagString.indexOf(brand) >= 0) { 
      console.log(tagString); 
      foundString = true; 
     } 
     }); 
     return foundString; 
    } 

Filterfunktionen anders als so etwas wie Karte wird nur verwendet, um die Größe des Arrays zu reduzieren, indem sie gegen eine Bedingung überprüft und wahr oder falsch zurück. Wenn Sie nur ein Array von Klassen haben möchten, können Sie nach dem Fitler mappen.

brandFiltered = brandFiltered.map(function(x){ return $(x).attr('class'); }); 
+0

Hat es Ihr Array filtern aber das ganze Element zurück, wenn Sie nur Klassen wollten? Kommentar hinzugefügt, um nach dem Filter eine Map zu erstellen, um ein Array von Klassennamen zu erhalten. – IrkenInvader

+1

Danke, dass es jetzt funktioniert! –