8
votes

Obtenez toutes les options possibles pour une matrice en JavaScript

J'ai un objet 'Item' dans JavaScript, et l'élément peut avoir des paramètres comme Couleur, taille, etc.

J'ai besoin d'obtenir toutes les combinaisons possibles dans un tableau. P>

alors disons que nous avons un élément qui ressemble à ceci: P>

[
    [{SettingName:'color',value:'green'},{SettingName:'size',value:'15'},{SettingName:'gender',value:'male'}],
    [{SettingName:'color',value:'blue'},{SettingName:'size',value:'15'},{SettingName:'gender',value:'male'}],
    [{SettingName:'color',value:'red'},{SettingName:'size',value:'15'},{SettingName:'gender',value:'male'}],
    [{SettingName:'color',value:'green'},{SettingName:'size',value:'18'},{SettingName:'gender',value:'male'}],
    [{SettingName:'color',value:'blue'},{SettingName:'size',value:'18'},{SettingName:'gender',value:'male'}],
    [{SettingName:'color',value:'red'},{SettingName:'size',value:'18'},{SettingName:'gender',value:'male'}],
    [{SettingName:'color',value:'green'},{SettingName:'size',value:'22'},{SettingName:'gender',value:'male'}],
    [{SettingName:'color',value:'blue'},{SettingName:'size',value:'22'},{SettingName:'gender',value:'male'}],
    [{SettingName:'color',value:'red'},{SettingName:'size',value:'22'},{SettingName:'gender',value:'male'}],
    [{SettingName:'color',value:'green'},{SettingName:'size',value:'15'},{SettingName:'gender',value:'female'}],
    [{SettingName:'color',value:'blue'},{SettingName:'size',value:'15'},{SettingName:'gender',value:'female'}],
    [{SettingName:'color',value:'red'},{SettingName:'size',value:'15'},{SettingName:'gender',value:'female'}],
    [{SettingName:'color',value:'green'},{SettingName:'size',value:'18'},{SettingName:'gender',value:'female'}],
    [{SettingName:'color',value:'blue'},{SettingName:'size',value:'18'},{SettingName:'gender',value:'female'}],
    [{SettingName:'color',value:'red'},{SettingName:'size',value:'18'},{SettingName:'gender',value:'female'}],
    [{SettingName:'color',value:'green'},{SettingName:'size',value:'22'},{SettingName:'gender',value:'female'}],
    [{SettingName:'color',value:'blue'},{SettingName:'size',value:'22'},{SettingName:'gender',value:'female'}],
    [{SettingName:'color',value:'red'},{SettingName:'size',value:'22'},{SettingName:'gender',value:'female'}]
]


0 commentaires

4 Réponses :


6
votes

Cela peut être une bonne question d'entretien.
Voir JS bin pour l'exemple en cours d'exécution.

getAllPermutations(newItem);

function getAllPermutations(item) {
    var permutations = [];

    getAllPermutations0(item, permutations, []);
    console.log(permutations);
}

function getAllPermutations0(item, permutations, array) {
    if (array && array.length === item.Settings.length) {
        permutations.push(array.slice()); // The slice clone the array
        return;
    }

    var index =  array.length;
    var setting = item.Settings[index];

    for (var i = 0; i < setting.values.length; i++) {
        if (index === 0)
            array =  [];

        var currValue = setting.values[i];

        array.push({
            SettingName: setting.name,
            value: currValue
        });

        getAllPermutations0(item, permutations, array);
        array.pop(); // pop the old one first
    }
}


1 commentaires

Merci beaucoup, ce n'est pas une interview, je suis coincé sur une tâche compliquée, merci Bro !!!



2
votes

Voici un aucun em> solution récursive. Il prend un paramètre Code> vide ou existant des paramètres CODE> "Matrix" et un Valeurs CODE> Array et renvoie une nouvelle matrice comme une combinaison de contenu matricielle existant cloné pour chaque nouvelle valeur, ajouté avec des paires de nouveaux éléments de réglage de la valeur.

[A] code> -> [1,2] code> donne [a] [1] [A] [2] p >

[A] [1] [A] [2] code> -> [x, y] code> donne [a] [1] [x] [A] [2] [Y] [A] [2] [x] [A] [1] [Y] [Y] CODE> P>

et ainsi de suite sur P>

[
[{"SettingName":"color","value":"green"},{"SettingName":"size","value":"15"},{"SettingName":"gender","value":"male"}],
[{"SettingName":"color","value":"blue"},{"SettingName":"size","value":"15"},{"SettingName":"gender","value":"male"}],
[{"SettingName":"color","value":"red"},{"SettingName":"size","value":"15"},{"SettingName":"gender","value":"male"}],
[{"SettingName":"color","value":"green"},{"SettingName":"size","value":"18"},{"SettingName":"gender","value":"male"}],
[{"SettingName":"color","value":"blue"},{"SettingName":"size","value":"18"},{"SettingName":"gender","value":"male"}],
[{"SettingName":"color","value":"red"},{"SettingName":"size","value":"18"},{"SettingName":"gender","value":"male"}],
[{"SettingName":"color","value":"green"},{"SettingName":"size","value":"22"},{"SettingName":"gender","value":"male"}],
[{"SettingName":"color","value":"blue"},{"SettingName":"size","value":"22"},{"SettingName":"gender","value":"male"}],
[{"SettingName":"color","value":"red"},{"SettingName":"size","value":"22"},{"SettingName":"gender","value":"male"}],
[{"SettingName":"color","value":"green"},{"SettingName":"size","value":"15"},{"SettingName":"gender","value":"female"}],
[{"SettingName":"color","value":"blue"},{"SettingName":"size","value":"15"},{"SettingName":"gender","value":"female"}],
[{"SettingName":"color","value":"red"},{"SettingName":"size","value":"15"},{"SettingName":"gender","value":"female"}],
[{"SettingName":"color","value":"green"},{"SettingName":"size","value":"18"},{"SettingName":"gender","value":"female"}],
[{"SettingName":"color","value":"blue"},{"SettingName":"size","value":"18"},{"SettingName":"gender","value":"female"}],
[{"SettingName":"color","value":"red"},{"SettingName":"size","value":"18"},{"SettingName":"gender","value":"female"}],
[{"SettingName":"color","value":"green"},{"SettingName":"size","value":"22"},{"SettingName":"gender","value":"female"}],
[{"SettingName":"color","value":"blue"},{"SettingName":"size","value":"22"},{"SettingName":"gender","value":"female"}],
[{"SettingName":"color","value":"red"},{"SettingName":"size","value":"22"},{"SettingName":"gender","value":"female"}]
]


2 commentaires

Cela fonctionne bien, mais j'ai aimé l'autre réponse plus, car il n'utilise pas JSON.PARSE (JSON.Stringify (Paramètres)), mais après avoir mis en main le temps que j'ai été remplacé pour voir que cette façon est 3 fois plus rapide (pourrait être juste Jsbin vs jsfiddle)


hey @cms, je suppose que non - le script est exécuté dans votre navigateur ... je ne sais pas, le mythe à propos de json.parse (json.stringify (paramètres) étant accablant lent a des raisons historiques - Toute seule façon d'obtenir un clone à 100% est une tâche coûteuse. Il n'y avait aucune raison particulière pour moi d'utiliser json.parse (json.paringify (paramètres)) , exactement ce que je suis hors de la tête savait que je pourrais utiliser comme onillet.



0
votes

Vous pouvez utiliser array.pototype.map () code>, pour code> boucle, pendant code> boucle, array.pototype.concat ( ) code>. Itérer sexe code> valeurs; Sélectionnez chacune des couleurs code>, code> Taille de la taille code> de la valeur de succession à l'index 0 code> de l'une ou l'autre; itération de la matrice adjacente la plus éloignée du courant sexe code>, incrémentez l'index de la matrice adjacente la plus proche; Fusionner le type de deux Gender code> pour former un tableau unique contenant toutes les combinaisons de Genre code>, couleur code>, Taille code>

<pre></pre>


3 commentaires

@CMS "Cela ne fonctionnera pas si un autre élément a d'autres paramètres comme la largeur, la couleur et ..." pas certains interpréter "ne fonctionneront pas", "Un autre élément a un autre paramètre" correctement? Pouvez-vous décrire ce que vous entendez par "ne pas fonctionner" et "un autre article a d'autres paramètres"?


vous avez mal codé les paramètres mais chaque élément a des paramètres différents, les 2 premières réponses fonctionnent très bien


Je l'ai eu pour travailler avec les 2 premières réponses, merci quand même



0
votes

Une approche utilisant array.pototype.reduce () code>, array.pototype.sort () code>, objet.keys () code>, pour code> boucle, tandis que code> boucle

p>

"Faux">
<pre></pre>


0 commentaires