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))