Skip to main content

zipWith

JS TODO

Creates an array of elements, grouped based on the position in the original arrays and using function as the last value to specify how grouped values should be combined.

Check if the last argument provided is a function. Use Math.max() to get the longest array in the arguments. Creates an array with that length as return value and use Array.from() with a map-function to create an array of grouped elements. If lengths of the argument-arrays vary, undefined is used where no value could be found. The function is invoked with the elements of each group (...group).

const zipWith = (...array) => {
const fn =
typeof array[array.length - 1] === "function" ? array.pop() : undefined;
return Array.from(
{ length: Math.max(...array.map((a) => a.length)) },
(_, i) => (fn ? fn(...array.map((a) => a[i])) : array.map((a) => a[i]))
);
};
zipWith([1, 2], [10, 20], [100, 200], (a, b, c) => a + b + c); // [111,222]
zipWith(
[1, 2, 3],
[10, 20],
[100, 200],
(a, b, c) =>
(a != null ? a : "a") + (b != null ? b : "b") + (c != null ? c : "c")
); // [111, 222, '3bc']