Nous allons décomposer le problème. Tout d'abord, nous allons obtenir extraire le premier élément de chaque sous-tableau de la route:
function get_elts(data, idx) {
return data.map(function(v) { return v[idx]; });
}
Alors
> get_elts(data, 0) // ['A', 'B', 'C']
Decomposing le problème comme celui-ci est essentiel à une bonne conception du programme. Nous ne voulons pas écrire des choses qui mélangent plusieurs problèmes. Dans ce cas, les problèmes multiples sont (1) obtenir le premier élément de chaque sous-tableau et (2) trouver les combinaisons. Si nous écrivons une routine qui mélange les deux problèmes, nous ne pourrons jamais la réutiliser pour d'autres choses. Si notre patron vient et dit maintenant qu'il veut trouver toutes les combinaisons de l'élément deuxième de chaque sous-tableau, nous allons devoir couper et coller et créer du code presque dupliqué. Ensuite, nous allons maintenir ce code pour le reste de nos vies ou au moins jusqu'à ce que nous quittions. La règle sur l'affacturage est le plus tôt possible.
Ensuite, créez toutes les combinaisons de deux tableaux:
function combinations(arr1, arr2) { //create all combos of elts in 2 arrays by
return [].concat.apply( //concatenating and flattening
[], //(starting with an empty array)
arr1.map( //a list created from arr1
function(v1) { //by taking each elt and from it
return arr2.map( //creating a list from arr2
function(v2) { //by taking each element and from it
return [v1, v2]; //making a pair with the first elt
}
);
};
)
);
}
Normalement, nous écrirait cette plus compacte. Marchons à travers elle:
Array#concat
combine une ou plusieurs choses, ou des éléments à l'intérieur de ces choses si elles sont des tableaux, dans un tableau.
Function#apply
permet de fournir un tableau qui deviendra la liste d'arguments de concat
.
Array#map
crée un réseau parallèle à arr1
, qui contient ...
- éléments qui sont des réseaux à deux éléments en fonction de bouclage sur
arr2
.
À droite, ce n'est pas le JavaScript de votre mère. C'est presque une langue différente du style dans lequel vous initialisez ceci et réglez cela et bouclez l'autre chose et renvoyez autre chose. En adoptant ce style, nous obtenons un code plus précis, concis, réutilisable, prouvable, futuriste et peut-être optimisable.
Par futur-amical, je veux dire entre autres ES6-friendly. Ce qui précède pourrait être réécrite comme:
combinations = (arr1, arr2) => [].concat(...arr1.map(v1 => arr2.map(v2 => [v1, v2])));
Obtenez les gars et les filles prêtes, cela viendra dans vos entretiens d'embauche assez rapidement maintenant. Il est temps de passer à partir de jQuery.
Maintenant, le problème peut être exprimé sous la forme:
var first_elts = get_elts(data, 0);
combinations(first_elts, first_elts);