2011-08-16 2 views
0

J'ai actuellement du code pour filtrer un tableau en fonction de la fourchette de prix en utilisant un curseur. Je dois être en mesure d'ajouter des cases à cocher pour différentes tailles et couleurs afin que je puisse également filtrer en utilisant leurs valeurs. C'est le code que j'ai jusqu'à présent, mais je ne sais pas comment implémenter les cases à cocher afin d'avoir plusieurs façons de filtrer le tableau.Comment avoir plusieurs filtres sur un tableau JQuery

//this is the main generated array 
    var product = [{"price":"200","color":"red","size":"small"}, 
        {"price":"250","color":"brown","size":"medium"}, 
        {"price":"300","color":"red","size":"large"}]; 

// array to display filtered array 
    var filteredProducts = []; 
    var key = 0; 

//start of price range filter 
    if(!minPrice && !maxPrice){ 
     filteredProducts = products; 
    } else{ 
     $.each(products, function(i, object) { 
      var curentPrice = parseFloat(object.price); 
      var priceMinOk = true; 
      var priceMaxOk = true; 
     // filter results match the price range 
      if(maxPrice || minPrice){ 
       if(maxPrice && maxPrice<curentPrice){ 
       priceMaxOk = false; 
       } 
       if(minPrice && minPrice>curentPrice){ 
       priceMinOk = false; 
       } 
      } 
     // loop over list and get only related to new array 
      if(priceMinOk && priceMaxOk){ 
       filteredProducts[key] = object;     
       key++; 
      } 
     }); 
    } 

Merci à l'avance pour toute aide »

Fiddle http://jsfiddle.net/ltbmedia/86pEn/

Répondre

1

Utilisation $.grep au lieu de $.each et structurer le code comme ceci:

var products = [ /* ... */ ], 
    predicates = [ 
     function predicate1(obj) { /* ... */ }, 
     function predicate2(obj) { /* ... */ }, 
     // ... , 
     function predicateN(obj) { /* ... */ } 
    ], 
    filteredProducts; 

filteredProducts = $.grep(products, function (element, index) 
{ 
    for (var i=0; i<predicates.length; i++) 
    { 
     if (!predicates[i](element)) return false; 
    } 

    return true; 
}); 

Exemple: http://jsfiddle.net/mattball/Rsbcu/


exemple plus complexe: http://jsfiddle.net/mattball/vZzjM/

Vous remarquerez peut-être que vous êtes encore obtenir un tableau vide en arrière, mais cela fait réellement sens. Étant donné les critères que vous avez spécifiés (minPrice = 201, maxPrice = 301, color = red or green, size = small) , il n'y a pas d'éléments de tableau correspondants.

les critères Desserrez prix juste un petit peu et vous verrez que tout fonctionne comme prévu: http://jsfiddle.net/mattball/MQ8Mc/

+0

Merci Matt, je suppose que chaque « fonction predicate1 (obj) {/ * .. . * /} est pour chaque élément du filtre (c'est-à-dire la taille), n'est-ce pas? – dbach

+0

C'est vrai. Chaque prédicat testerait une condition distincte sur chaque élément. Dans l'exemple de code de votre question, vous utiliseriez deux prédicats, l'un pour tester la condition de prix minimum et l'autre pour tester la condition de prix maximum. BTW, un prédicat est une fonction qui renvoie une valeur booléenne. –

+0

Merci encore, mais je ne suis pas sûr de savoir ce que vous voulez dire. Comment un test de fonction de prédiction pour une valeur d'élément spécifique, désolé, m'a cogné la tête contre le mur toute la journée sur celui-ci! – dbach

Questions connexes