Created
May 20, 2015 08:35
-
-
Save Integralist/749153aa53fea7168e7e to your computer and use it in GitHub Desktop.
Array flatten function written in ES6 syntax
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
const flattenTco = ([first, ...rest], accumulator) => | |
(first === undefined) | |
? accumulator | |
: (Array.isArray(first)) | |
? flattenTco([...first, ...rest]) | |
: flattenTco(rest, accumulator.concat(first)) | |
const flatten = (n) => flattenTco(n, []); | |
console.log(flatten([[1,[2,[[3]]]],4,[5,[[[6]]]]])) |
Not effective but interesting!
arr = [1,2,3,[4,5,[1,2,3,4,56,67],6,7,[7.5,7.6,7.9],8],9,10,11]
const flat = (arr, depth= Infinity ,arr2 = []) =>{
arr.forEach(e => {
typeof e === 'object' && depth ? flat(e, depth-1 ,arr2) : arr2.push(e)
});
return arr2
}
console.log(flat( arr, 1 )) // [ 1, 2, 3, 4, 5, [ 1, 2, 3, 4, 56, 67 ], 6, 7, [ 7.5, 7.6, 7.9 ], 8, 9, 10, 11 ] // Depth 1 falt
console.log(flat(arr)) // [ 1, 2, 3, 4, 5, 1, 2, 3, 4, 56, 67, 6, 7, 7.5, 7.6, 7.9, 8, 9, 10, 11 ] // Full flat
const deepFlat = (arr) => arr.flat(Infinity)
one hack solution. (deep nested also works)
JSON.stringify(arr).split(',').map(each => each.match(/[+-]?\d+(?:\.\d+)?/g)[0])
one hack solution. (deep nested also works)
JSON.stringify(arr).split(',').map(each => each.match(/[+-]?\d+(?:\.\d+)?/g)[0])
work like a charm for number, but not with string ['un', 2, 'trois', 4, 'cinq'].
For immutable solution, this should be the most performant one, because it uses only pop() and push():
const flatten = (list) => {
const stack = [list];
const result = [];
while(stack.length > 0) {
const elem = stack.pop();
if (Array.isArray(elem)) {
for (let i = elem.length - 1; i >= 0; i--) {
stack.push(elem[i]);
}
} else {
result.push(elem);
}
}
return result;
};
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Output
[1, 2, 3, 1, 2, 3, 4, 5, 6, 7, 9, 10]