2014-09-10 3 views
0

je le tableau suivant:Comment trouver toutes les combinaisons d'éléments dans le tableau JavaScript

[[A, 1, X], [B, 2, Y], [C, 3, Z]]

Je veux être en mesure d'obtenir toutes les combinaisons du premier index de chaque sous-groupe, puis passer en boucle à travers ces combinaisons en effectuant une seule tâche sur chacun. Donc ce sont les combinaisons que je suis après (Note J'ai besoin de la combinaison de la même valeur):

[[A, A], [A, B], [A, C], [B, A ], [B, B], [C, A], [C, B], [C, C]]

Je ferais alors une boucle à travers cela et faire quelque chose avec chacun des valeurs.

Je ne sais pas où même commencer ici donc tout conseil ou pointeur serait vraiment utile!

Répondre

0

Essayez ceci:

var data = [['A',1,'X'],['B',2,'Y'],['C',3,'Z']]; 

function getCombinations(data) { 
    var combinations = []; 
    data.forEach(function(first) { 
     data.forEach(function(second) { 
      combinations.push([first[0], second[0]]); 
     }); 
    }); 
    return combinations; 
} 

console.log(getCombinations(data)); 

Voici le jsfiddle-demo

1

Vous devez boucle efficacement à travers le réseau deux fois. Sur la base de ce que vous voulez, vous pouvez simplement accéder statiquement le premier élément à chaque fois:

var arr = [['A',1,'X'],['B',2,'Y'],['C',3,'Z']]; 
var newArr = []; 
var length = arr.length; 
var curr; 

for (var i = 0; i < length; i++) { 
    curr = arr[i][0]; 

    for (var j = 0; j < length; j++) { 
     newArr.push([curr, arr[j][0]]); 
    } 
} 

console.log(newArr); 

Fiddle

0

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:

  1. 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.
  2. Function#apply permet de fournir un tableau qui deviendra la liste d'arguments de concat.
  3. Array#map crée un réseau parallèle à arr1, qui contient ...
  4. é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); 
Questions connexes