Creates an array of elements, ungrouping the elements in an array produced by zip and applying the provided function.
- Use
Math.max()
,Function.prototype.apply()
to get the longest subarray in the array,Array.prototype.map()
to make each element an array. - Use
Array.prototype.reduce()
andArray.prototype.forEach()
to map grouped values to individual arrays. - Use
Array.prototype.map()
and the spread operator (...
) to applyfn
to each individual group of elements.
const unzipWith = (arr, fn) => arr .reduce( (acc, val) => (val.forEach((v, i) => acc[i].push(v)), acc), Array.from({ length: Math.max(...arr.map(x => x.length)) }).map(x => []) ) .map(val => fn(...val));
Examples
unzipWith( [ [1, 10, 100], [2, 20, 200], ], (...args) => args.reduce((acc, v) => acc + v, 0) ); // [3, 30, 300]
Recommended snippets
unzip
JavaScript, Array
Creates an array of arrays, ungrouping the elements in an array produced by zip.
symmetricDifferenceBy
JavaScript, Array
Returns the symmetric difference between two arrays, after applying the provided function to each array element of both.
differenceBy
JavaScript, Array
Returns the difference between two arrays, after applying the provided function to each array element of both.