reduce()高阶函数如何工作?

时间:2018-06-12 07:41:45

标签: javascript

以下是reduce()功能

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

现在这是我正在解决的问题

将reduce方法与concat方法结合使用,将数组数组“展平”为包含原始数组所有元素的单个数组。

这是解决方案

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

现在如果我试试这个

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

我明白了

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

这意味着此解决方案只能获得最多两个嵌套数组的展平数组 但它是如何工作的 arrays = [[1,2,3],[4,5],[6]];

因为我正在使用reduce()函数 因为我使用

,所以(让数组的元素)

它像这样工作

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

// 146[6,7]7686 

它不会从嵌套数组中获取值 那么第一个解决方案是如何实现的呢 以及如何编写适用于任意数量的嵌套数组的解决方案,我知道它将使用递归但是如何?

2 个答案:

答案 0 :(得分:2)

为什么这个函数只能将数组展平到一个深度?

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

因为reduce函数不知道您是否尝试连接基元(数字)或数组。当reduce函数尝试连接两个数组时,它会生成一个数组,但它不知道数组中的每个元素是数字还是数组。

然后,如您所建议,您可以使用递归

 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));
        }
      }, []);
    }

答案 1 :(得分:2)

你可以这样做:



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);