Extract child arrays from nested arrays
Element like [[14, 15], [16, 17]]
will introduce a []
after recursion. This should be handled by checking length.
var arrs = [ [1, 2, [3, 4], 5], [6, [7, 8, 9, [10, 11]]], [12, 13], [[14, 15], [16, 17]], [[1], 4, [1, 1], 4]];function extractArrays (arr, acc=[]) { if (arr.length == 0 ) return acc; let pure = arr.filter(elm => !Array.isArray(elm)); if (pure.length > 0) { acc.push(pure); } acc.concat(arr.filter(elm => Array.isArray(elm)).map(elm => extractArrays(elm, acc))); return acc;}console.log(extractArrays(arrs));
You can try the following code
var arrs = [ [1, 2, [3, 4], 5], [6, [7, 8, 9, [10, 11]]], [12, 13], [ [14, 15], [16, 17] ], // <-- added additional test case [ [1], 4, [1, 1], 4 ]];function extractArrays(arr) { return arr.reduce((res, curr, i) => { if (Array.isArray(curr)) { res = res.concat(extractArrays(curr)); } else { let index = 0; for (let j = 0; j <= i; j++) { if (!Array.isArray(arr[j])) { res[index] ? res[index].push(curr) : res.push([curr]); break; } else { index++; } } } return res; }, []); // <-- no initial empty array inside here}console.log(extractArrays(arrs));
I just wanted to share my approach to this problem, I enjoyed trying to solve it, in my case I also passed an array to the extractArrays
method, in order to make easier to capture and filter every array inside the arrs
param.
let result = [];extractArrays(arrs, result);console.log(result);function extractArrays(arr, result) { let newResult = arr.reduce((acc, curr) => { if (Array.isArray(curr)) { extractArrays(curr, result); } else { acc.push(curr); } return acc; }, []); newResult.length && result.push(newResult);}