javascript - js数组扁平化,可以降维多层
阿神
阿神 2017-04-11 12:15:27
[JavaScript讨论组]

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]]]]);
阿神
阿神

闭关修行中......

全部回复(5)
伊谢尔伦

写递归一定要搞明白,什么情况下进入递归调用,什么情况下结束递归调用,以及递归调用返回的什么,返回的值要怎么用。

你在递归调用有返回值(扁平化的数组),但没处理返回值(本来应该加到 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);
PHPz

你在Array.isArray为true的分支里没有重新给newArr赋值, 所以结果不对

function steamroller(arr) {
    var newArr = [];
    for (var i = 0, len = arr.length; i < len; i++) {
        if (Array.isArray(arr[i])) {
            newArr = newArr.concat(steamroller(arr[i]));
        } else {
            newArr = newArr.concat(arr[i]);
        }
    }
    return newArr;
}

[1, [2], [3, [[4]]]].toString()本来就是"1,2,3,4"

PHPz
function steamroller(arr) {
  var newArr=[];
  for (var i = 0; i < arr.length; i++) {
    if (Array.isArray(arr[i])) {
      newArr=newArr.concat(steamroller(arr[i]));
    } else {
      newArr.push(arr[i]);
    }
  }
  return newArr;
}
steamroller([1, [2], [3, [[4]]]]).join(",");

第一输出steam1,2,3,4是因为([1, [2], [3, [[4]]]]).toString()本来就是1,2,3,4

高洛峰

使用reduce代码可以更简单

es6:

const flatten = arr => arr.reduce((a, b) => a.concat(Array.isArray(b) ? flatten(b) : b), []);

es5:

var flatten = function(arr){
    return arr.reduce(function(a,b){
       return a.concat(Array.isArray(b)? flatten(b):b)
    },[]);
}
PHP中文网

var newArr = [];放外面

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号