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