const newArr = Array.from(
{ length: arr.length / 2 },
(n, i) => ({ ...arr[i], ...arr[i + arr.length / 2] })
);
Но всегда ли количество ключей будет равно двум? - лучше посчитаем самостоятельно, сколько их там:
const numKeys = new Set(arr.flatMap(Object.keys)).size;
const newArr = arr.reduce((acc, n, i, a) => (
Object.assign(acc[i % (a.length / numKeys)] ??= {}, n),
acc
), []);
// или
const numKeys = Object.keys(Object.assign({}, ...arr)).length;
const numObjs = arr.length / numKeys;
const newArr = Array.from(
{ length: numObjs },
(n, i) => Object.assign({}, ...Array.from(
{ length: numKeys },
(m, j) => arr[j * numObjs + i]
))
);
Или можно считать какой ключ сколько раз встретился, и добавлять свойство соответствующему элементу собираемого массива:
const newArr = arr.reduce((acc, n) => {
const [ [ k, v ] ] = Object.entries(n);
const i = acc[0][k] = (acc[0][k] ?? -1) + 1;
(acc[1][i] ??= {})[k] = v;
return acc;
}, [ {}, [] ])[1];