2015-04-16 3 views
0

je code suivant:produit cartésien avec des tableaux imbriqués et les valeurs non numériques en javascript

 filters = [ 
      { 
      "see":false, 
      "make":true, 
      "means":true, 
      }, 
      { 
      "less":false, 
      "up3":false, 
      "up6":false, 
      "all":true, 
      "more":false, 
      "var":false 
      }, 
      { 
      "one":false, 
      "small":true, 
      "medium":false, 
      "large":false 
      } 
     ]; 

    function cartesianProductOf() { 
     return _.reduce(arguments, function(a, b) { 
      return _.flatten(_.map(a, function(x) { 
       return _.map(b, function(y) { 
        return x.concat([y]); 
       }); 
      }), true); 
     }, [ [] ]); 
    } 

    function cleaning(collection){ 
     var r = []; 
     _.each(collection,function(element,index){ 
      r[index] = []; 

      if(_.isObject(element)){ 
       r[index] = _.map(element,function(val,key){ 
        if(val) return key; 
       }); 
      } 
      r[index] = _.compact(r[index]); 

     }); 
     return r; 
    } 


    // cleaning is producing following array 
    // [["make","means"],["all"],["small"]] 

    clean = cleaning(filters); 
    prod = cartesianProductOf(clean); 

    $('#result').append(JSON.stringify( prod)); 

Je me attends résultat le long des lignes: [["make","all","small"], ["means","all","small"]]

mais je suis en train de [[["make","means"]],[["all"]],[["small"]]] à la place.

cartésienne algorithme produit est d'ici: Cartesian product of multiple arrays in JavaScript

ici est mon violon: https://jsfiddle.net/NFSfs/17/ Toute idée serait appréciée.

Répondre

0

En bref:

changer juste pour

prod = cartesianProductOf.apply(null, clean); 

Où était erreur:

La réponse est très simple, vous coincé avec le problème de langage dynamique classique avec des types, cartesianProductOf est en attente tableau dans "arguments" qui signifie que tous les tableaux doivent être transmis entre parenthèses délimitées par une virgule:

cartesianProductOf(["make","means"],["all"],["small"]) 

mais vous passez un seul argument qui est la liste des listes

cartesianProductOf([["make","means"],["all"],["small"]]) 

et fonction t-il exactement, renvoyer le tableau initial en raison du produit cartésien d'un tableau est ce tableau

+0

Remerciez toi! Quelle erreur évidente. –