Мне нравится разбивать обработку на две части:
const zipWith = (fn) => (a, b) => [...Array(Math.max(a.length, b.length))]
.map((_, i) => fn(a[i], b[i]))
const combine = zipWith ((a, b) =>
a && b ? {...a, ...b} : a ? {...a} : b ? {...b} : null)
console.log(combine([null, null, {a: 1}], [{c: 3}, null, {a: 3, b: 2}]))
console.log(combine([], [null, null, {t: 4}]))
.as-console-wrapper { max-height: 100% !important; top: 0; }
"zip
" - это общее имя для функции, которая объединяет два массива, индекс за индексом. Иногда «zipWith
» используется для расширения, которое принимает функцию для решения, как объединить эти два значения. Эта версия zipWith
немного сложнее, чем другие варианты, поскольку в ней используется большая длина двух входных массивов, а не только длина первого (которая может быть записана zip = (fn) => (a1, a2) => a1.map((a, i) => fn(a, a2[i]))
.)
combine
вызывает это с помощью функции, которая обрабатывает четыре случая: a null
/ b null
, a null / b non-null
, a non-null / b null
и a non-null / b non-null
, используя или комбинируя предоставленные значения.
zipWith
- это многократно используемая функция, которая может оказаться полезной в других местах вашего приложения. combine
более конкретно относится к этому случаю.