So, I am trying to regroup the elements... well in a way that is hard to explain. Here is a sample of input and expected output...
zip(['fred', 'barney'], [30, 40], [true, false]);
should output...
→ [['fred', 30, true], ['barney', 40, false]]
I thought reduce would be appropriate since I am supposed to take multiple arrays and convert it into a single array that contains the same amount of arrays as the input array's length...
Here is what I am working on... It isn't functioning but I believe I am close to the right idea!
function zip(array) {
return array.reduce((acc, next) => {
// get length of next array to use in for-loop...
let numOfElem = next.length
// use a for loop to access different indexed arrays...
for (let i = 0; i < numOfElem; i++) {
// this is supposed to push the appropriate element in the next array to the accumulator array's corresponding index...
acc[i].push(next[i]);
}
return acc;
}, [])
}
const result = zip(['fred', 'barney'], [30, 40], [true, false]);
console.log(result);
I believe I am attempting to push incorrectly? The idea behind acc[i].push(next[i]) is that acc[i] would create the necessary amount of arrays based off of the length of the input arrays. The code is non-functional. I am just looking for a way to get it working, even if by a different method!
Thanks for taking the time to read this and for any feedback, tips or tricks!
You could reduce the parameters and map the part result of the same index.
const
zip = (...array) =>
array.reduce((r, a) => a.map((v, i) => [...(r[i] || []), v]), []);
console.log(zip(['fred', 'barney'], [30, 40], [true, false]));
.as-console-wrapper { max-height: 100% !important; top: 0; }
Approach for unequal lengths of arrays.
const
zip = (...array) => array.reduce((r, a, i) => {
while (r.length < a.length) r.push(Array(i).fill(undefined));
return r.map((b, j) => [...b, a[j]]);
}, []);
console.log(zip(['fred', 'barney'], [30, 40, 3, 4, 5, 6, 7], [true, false, 'don\'t know']));
.as-console-wrapper { max-height: 100% !important; top: 0; }
Something like this?
const zip=(arr)=>{
let res=[]
arr[0].forEach((el,k) => {
res.push(arr.reduce((acc, curr)=>{
acc.push(curr[k])
return acc
},[]))
});
return res
}
console.log(zip([['moe', 'larry', 'curly'], [30, 40, 50], [true]]))
function zip(...arrays) {
const flattened = arrays.flatMap(item => item)
const result = []
for (let index = 0; index <= arrays.length; index++) {
result[index] = []
for (let step = index; step < flattened.length; step = step + arrays[0].length) {
result[index][(step - index) / arrays[0].length] = flattened[step]
}
}
return result
}
const arr1 = [ 'fred', 'barney', 'alpha', 'beta' ]
const arr2 = [ 30, 40, 50, 60 ]
const arr3 = [ true, false, null, true ]
console.log(zip(arr1, arr2, arr3))