Définition du problème
Fusionner deux tableaux array1 et array2 pour donner un tableau fusionné merged. Soit:
// Entrée: var array1 = [[0,5],[2,10],[4,20]] var array2 = [[1,2],[2,4],[3,6]] // Sortie var merged = [[0, 5, null], [1, null, 2], [2, 10, 4], [3, null, 6], [4, 20, null]]
Définition
1. array1 et array2 sont triés selon l'index 0 de chaque élément 2. Soit A, un élément du premier tableau (array1) 3. Soit B, un élément du deuxième tableau (array2) 4. Soit C, un élément du tableau fusionné 5. Soit A0, la liste des nombres dans l'index 0 de chacun des éléments de array1 5. Soit B0, la liste des nombres dans l'index 0 de chacun des éléments de array2 Alors: Si A[0] est dans les B0 : C = [ A[0], A[1], B[1] ] Si A[0] n'est pas dans B0: C = [ A[0], A[1], null ] Si B[0] n'est pas dans A0: C = [ B[0], null, B[1] ]
Première solution : fonctionnelle
Avec map, concat, sort et forEach. On convertit les deux tableaux en tableau de 3 éléments, on les fusionne puis on les tries selon l'index 0.
Ensuite on fusionne les doublons.
var nonmerged = array1.map(function(a) { return [a[0], a[1], null]; }).concat( array2.map(function(a) { return [a[0], null, a[1]]; })).sort( function(a,b) { return a[0]-b[0]; } ); nonmerged.forEach(function(v, i) { if (i && nonmerged[i-1][0] == v[0]) { nonmerged[i-1][2] = v[2]; } else { merged.push(v); } }); console.log(JSON.stringify(merged))
Deuxième solution : semi-fonctionnel avec objet associatif (conversion number en string)
On place tous les index 0 dans un tableau associatif. Si on trouve l'index 0 du premier tableau dans le tableau associatif (comme un clé), alors on fusionne. Puis, on ajoute les éléments restants du deuxième tableau (objet).
Finalement, on tri.
var map = {}; array2.forEach(function(a) { map[a[0]] = a[1]; }) var merged = array1.map(function(a) { var end = null; if (a[0] in map) { end = map[a[0]]; delete map[a[0]]; } return [a[0], a[1], end]; }) for (i in map) { merged.push([+i, null, map[i]]); } merged.sort(function(a,b) { return a[0] - b[0];}) console.log(JSON.stringify(merged))
Troisième solution : procédurale
On avance dans chacun des tableaux en vérifiant qu'on a rien oublié en chemin.
var merged = []; for (var i = 0, j = 0; i < array1.length; i++) { var firstNumber = array1[i][0]; while (j < array2.length && firstNumber > array2[j][0]) { merged.push([array2[j][0], null, array2[j][1]]); j++; } if (j < array2.length && firstNumber === array2[j][0]) { merged.push([array2[j][0], array1[i][1], array2[j][1]]); j++; } else { merged.push([array1[i][0], array1[i][1], null]); } } while (j < array2.length) { merged.push([array2[j][0], null, array2[j][1]]); j++; } console.log(JSON.stringify(merged))
Dernière modification: 2014-12-22 21:01:15 par Yan Morin
Hébergé par ProgYSM