Как создать универсальную функцию Map/Zip, которая транспонирует N массивов
У меня есть N Arrays. Как я могу создать общую функцию Map/Zip, которая может транспонировать N количество массивов вместе. Пожалуйста, смотрите код ниже, например. Кроме того, как я могу заставить это работать для многомерных массивов. Спасибо.
// A Arrays
const arrayA1 = [{name: "James"}, {name: "John"}, {name: "Jack"}]
const arrayA2 = [{age: 10}, {age: 20}, {age: 12}]
// B Arrays
const arrayB1 = [{name: "James"}, {name: "John"}, {name: "Jack"}]
const arrayB2 = [{age: 10}, {age: 20}, {age: 12}]
const arrayB3 = [{height: 150}, {height: 200}, {height: 180}]
const result = {}
const result1 = {}
// Transpose A Arrays Only (does not work for B Arrays)------ How can i make the SAME function work for both A and B arrays
arrayA1.map((x, y) => {
let abc = [x, arrayA2[y]];
result1[y] = abc;
result[x.name] = arrayA2[y]
})
console.log(result);
// { James: { age: 10 }, John: { age: 20 }, Jack: { age: 12 } }
// WHICH IS BETTER IMPLEMENTATION >>>>>> result or result1 >> I intend to send to mongodb
console.log(result1);
/*
{ '0': [ { name: 'James' }, { age: 10 } ],
'1': [ { name: 'John' }, { age: 20 } ],
'2': [ { name: 'Jack' }, { age: 12 } ] }
*/
1 ответ
Решение
Лучшей структурой результата будет массив объектов, таких как
[
{name: xxx, age: yyy},
{name: xxx, age: yyy},
{name: xxx, age: yyy}
]
Вот код для его генерации:
// A Arrays
const arrayA1 = [{name: "James"}, {name: "John"}, {name: "Jack"}]
const arrayA2 = [{age: 10}, {age: 20}, {age: 12}]
// B Arrays
const arrayB1 = [{name: "James"}, {name: "John"}, {name: "Jack"}]
const arrayB2 = [{age: 10}, {age: 20}, {age: 12}]
const arrayB3 = [{height: 150}, {height: 200}, {height: 180}]
//
zip = (...arrays) => arrays[0].map((_, n) => arrays.map(a => a[n]));
merge = (x, y) => Object.assign(x, y);
zipMerge = (...arrays) => zip(...arrays).map(props => props.reduce(merge, {}))
//
console.log(zipMerge(arrayA1, arrayA2))
console.log(zipMerge(arrayB1, arrayB2, arrayB3))