объединить несколько массивов бок о бок по заданному ключу - PullRequest
0 голосов
/ 17 июня 2020

У меня есть три объекта:

V1 = [[a, 2, 4], 
      [b, 5, 5],
      [c, 4, 1]]

V2 = [[b, 1, 7], 
      [c, 3, 8],
      [d, 5, 4]]

V3 = [[a, 5, 2], 
      [b, 0, 9],
      [d, 3, 1]]

Я хочу, чтобы результат был примерно таким:

[[a,2,4,0,0,5,2],
 [b,5,5,1,7,0,9],
 [c,4,1,3,8,0,0],
 [d,0,0,5,4,3,1]]

Как мне этого добиться?

Ответы [ 2 ]

0 голосов
/ 17 июня 2020

Вы можете собрать значения в объекте, а затем взять массив с пустыми значениями по умолчанию и назначить собранные значения.

var v1 = [['a', 2, 4], ['b', 5, 5], ['c', 4, 1]],
    v2 = [['b', 1, 7], ['c', 3, 8], ['d', 5, 4]],
    v3 = [['a', 5, 2], ['b', 0, 9], ['d', 3, 1]],
    parts = [v1, v2, v3],
    empty = Array(parts.length * 2 + 1).fill(0);
    temp = parts.reduce((r, a, i) => {
        a.forEach(([key, ...values]) => {
            r[key] = r[key] || { 0: key };
            for (let j = 0; j < values.length; j++) {
                r[key][i * values.length + j + 1] = values[j];
            }
        });
        return r;
    }, {}),
    result = Object.values(temp).map(v => Object.assign([], empty, v));

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
0 голосов
/ 17 июня 2020

Это будет работать, но это не очень красиво;)

const flattenSiblings = (...plots) => {
   return plots.reduce((acc, c, i) => {
        c.flat();
        acc.push(...c);
        // return the array sorted alphabetically by its first element
        return acc.sort((a ,b) => ((a[0] > b[0]) && +1, (a[0] < b[0]) && -1));
    }, []);
}

let f = flattenSiblings(V1, V2, V3);

/* 
Hardcoded concatenation of the desired result since 
the pattern of how 0,0 should be inserted was not defined.
*/
let result = [
    [
        ...f[0].flat(),
        ...[0,0],
        ...f[1].slice(1,3).flat()
    ],
    [
        ...f[2].flat(),
        ...f[3].slice(1,3).flat(),
        ...f[4].slice(1,3).flat()
    ],
    [
        ...f[5].flat(),
        ...f[6].slice(1,3).flat(),
        ...[0,0]  
    ],
    [
        f[7][0],
        ...[0,0],
        ...f[7].slice(1,3).flat(),
        ...f[8].slice(1,3).flat() 
    ]
];
...