问 题
1 数组扁平化,我尝试写了一下,但是return的结果不对,我将console.log放在最顶端,打印的结果第一次却是对的,为什么?这个递归哪里出了问题?
function steamroller(arr) {
// I'm a steamroller, baby
var newArr = [];
console.log("steam"+arr) //这里为什么第一次结果是对的?
for (var i = 0; i < arr.length; i++) {
if (Array.isArray(arr[i])) {
//console.log(arr[i])
steamroller(arr[i]);
} else {
newArr = newArr.concat(arr[i]);
}
}
//console.log(newArr)
return newArr
}
steamroller([1, [2], [3, [[4]]]]);
解决方案
写递归一定要搞明白,什么情况下进入递归调用,什么情况下结束递归调用,以及递归调用返回的什么,返回的值要怎么用。
你在递归调用有返回值(扁平化的数组),但没处理返回值(本来应该加到 newArr中去),主要应该就是这个问题。
function steamroller(arr) {
var newArr = [];
for (var i = 0; i < arr.length; i++) {
if (Array.isArray(arr[i])) {
// 如果是数组,调用(递归)steamroller 将其扁平化
// 然后再 push 到 newArr 中
newArr.push.apply(newArr, steamroller(arr[i]));
} else {
// 不是数组直接 push 到 newArr 中
newArr.push(arr[i]);
}
}
return newArr;
}
var source = [1, [2], [3, [[4]]]];
var r = steamroller(source);
console.log(source);
console.log(r);
扫一扫关注IT屋
微信公众号搜索 “ IT屋 ” ,选择关注与百万开发者在一起