Atul Mishra
Atul Mishra

Reputation: 43

How reduce() higher order function works?

Below is reduce() function

function reduce(array, combine, start) { 
    let current = start;
    for (let element of array) { 
        current = combine(current, element); 
    }
    return current;
}

Now this is the question which i am solving

Use the reduce method in combination with the concat method to “flatten” an array of arrays into a single array that has all the elements of the original arrays.

Here is the solution

let arrays = [[1, 2, 3], [4,5], [6]]; 
console.log(arrays.reduce((flat,current)=> flat.concat(current), []));
// → [1, 2, 3, 4, 5, 6]

Now if i try this

let arrays = [[1, 2, 3], [4, [79],5], [6]];
console.log(arrays.reduce((flat, current) => flat.concat(current), []));

I get this

[1, 2, 3, 4, [79], 5, 6]

It means that this solution can get a flatten array only up to two nested array But how it works for this arrays = [[1, 2, 3], [4,5], [6]];

Because in reduce() function i am using for( let elements of array) which by the way if i use

It works like this

array = [1,4,6,[6,7],7,6,8,6];
for(element of array) 
   console.log(element);

// 146[6,7]7686 

It does not gets the value from nested array Then how does it for the first solution And how to write solution which works for any number of nested array i know it will use recursion but how ?

Upvotes: 1

Views: 214

Answers (2)

Yosvel Quintero
Yosvel Quintero

Reputation: 19070

You can do:

const arrays = [[1, 2, 3],[4, [79], 5],[6]];
const getFlatten = array => array.reduce((a, c) => a.concat(Array.isArray(c) ? getFlatten(c) : c), []);
const result = getFlatten(arrays);

console.log(result);

Upvotes: 2

Damian Peralta
Damian Peralta

Reputation: 1876

why this function can only flatten array up to one level deep ?

let arrays = [[1, 2, 3], [4, [79],5], [6]];console.log(arrays.reduce((flat, current) => flat.concat(current), []))

Because the reduce function doesn't know if you are trying to concatenate a primitive (a number) or an array. When the reduce functions tries to concatenate two arrays, it produces a single array, but it doesn't know if every element in the array is a number or an array.

Then, as you suggested, you can use recursion:

 function flatten(arrayToFlatten){
      return arrayToFlatten.reduce((prev, next)=>{
        if(!Array.isArray(next)){ // Base case, when you have a number
           return prev.concat(next);
        } else { // Recursive case, when you have an array
           return prev.concat(flatten(next));
        }
      }, []);
    }

Upvotes: 2

Related Questions