This gist discusses the implementation of Array flattening with JavaScript. It returns a single array with all of its element recursively flattened.
To Run Test
node flat_array_test.jsThis gist discusses the implementation of Array flattening with JavaScript. It returns a single array with all of its element recursively flattened.
To Run Test
node flat_array_test.js| const flat = array => { | |
| let collector = []; | |
| if (!(array instanceof Array)) { | |
| throw new Error('Not an array'); | |
| } | |
| for (let elem of array) { | |
| if (elem instanceof Array) { | |
| collector = [...collector, ...flat(elem)]; | |
| } else { | |
| collector = [...collector, elem]; | |
| } | |
| } | |
| return collector; | |
| }; | |
| module.exports = flat; |
| const flat = require('./flat_array'); | |
| const { assertDeepEqual, shouldThrow } = require('./test'); | |
| assertDeepEqual( | |
| flat([1, 2, 3, [4, 5, [6, 7, 8, [9, 10]]], 11, 12, [13, 14]]), | |
| [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14], | |
| 'Should flatten all nested arrays into a single one' | |
| ); | |
| assertDeepEqual( | |
| flat([1, 2, 3, [4, 5, [6, 7, 8, [9, 10]]]]), | |
| [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], | |
| 'Should flatten all nested arrays into a single one 2' | |
| ); | |
| assertDeepEqual( | |
| flat([1, 2, 3]), | |
| [1, 2, 3], | |
| 'Should return the same array if it is flattened already' | |
| ); | |
| assertDeepEqual(flat([]), [], 'Return an empty array if the input is empty'); | |
| assertDeepEqual(flat([1, 2, 3, []]), [1, 2, 3], 'Ignore empty array'); | |
| shouldThrow(() => flat(1), 'Should throw an error if input is not an array'); |
| // Simple Test Library | |
| function assertEq(left, right, info = '') { | |
| if (left !== right) { | |
| console.error(`Test Failed ❗️: | |
| Expected => ${right} | |
| Got => ${left}`); | |
| } else { | |
| console.log(`Test: ${info} Passed`); | |
| } | |
| } | |
| function assertDeepEqual(left, right, info = '') { | |
| if (!left.every((e, i) => e === right[i])) { | |
| console.error(`Test Failed: | |
| Expected => ${right} | |
| Got => ${left}\n`); | |
| } else { | |
| console.log(`\n${info}: Passed ✅\n`); | |
| } | |
| } | |
| function shouldThrow(cb, info = '') { | |
| let hasthrown = false; | |
| try { | |
| cb(); | |
| } catch (error) { | |
| hasthrown = true; | |
| console.log(`\n${info}: Passed ✅\n`); | |
| } finally { | |
| if (!hasthrown) { | |
| console.error(`Test Failed: Didn't throw an error\n`); | |
| } | |
| } | |
| } | |
| module.exports = { assertEq, assertDeepEqual, shouldThrow }; |