Не будем ограничиваться двумя массивами. Соответственно, и ключи хардкодить тоже не будем. Пусть функция принимает массив ключей и массив массивов значений:
function combine(keys, values) {
const length = Math.max(0, ...values.map(n => n.length));
const arr = Array.from({ length }, () => ({}));
values.forEach((n, i) => n.forEach((v, j) => arr[j][keys[i]] = v));
return arr;
}
// или
const combine = (keys, values) =>
Array.from(
{ length: values.reduce((max, { length: n }) => max > n ? max : n, 0) },
(_, j) => keys.reduce((acc, k, i) => (
j < values[i].length && (acc[k] = values[i][j]),
acc
), {})
);
// или
const combine = (keys, values) =>
keys.reduce((acc, k, i) => (
values[i].forEach((v, j) => (acc[j] = acc[j] || {})[k] = v),
acc
), []);
Пользоваться всем этим, понятное дело, так:
const newArray = combine([ 'name', 'id' ], [ nameArray, idArray ]);