javascript - js数组递归遍历
阿神
阿神 2017-04-10 15:06:07
[JavaScript讨论组]

给定一个随机数组,数组可能包含数组(也就是说数组元素可能为数组)。要求用js实现一个函数,返回该数组中所有元素。例如,例如:数组[2,3,[4,6,[1,8]],12,10],返回结果为:[2,3,4,6,1,8,12,10]

错误代码:
function getArray(arr)
{
    var arrs = []; 
    for(i=0;i<arr.length;i++)
    {
        if(typeof arr[i] == "number")
        {
            arrs.push(arr[i])
        }
        else{ 
            var temp = getArray(arr[i]);
            arrs.concat(temp);
        }
    } 
    return arrs;
}
正确代码:
var arrs = []; 
function getArray(arr)
{
    for(i=0;i<arr.length;i++)
    {
        console.log(arrs);
        if(typeof arr[i] == "number")
        {
            arrs.push(arr[i])
        }
        else{ 
            getArray(arr[i]);
        }
    } 
}
输出arrs为正确答案

请问第一个代码为什么是错的???

阿神
阿神

闭关修行中......

全部回复(2)
高洛峰

.concat 是返回合并数组,不是直接在原数组上修改的,你这么改一下应该就 OK 了:

arrs = arrs.concat(temp);

另外,你的 for 循环用的 i 没有用 var 定义,所以是全局变量,在递归调用的时候 i 的值会随着递归改变,所以会有数据无法进入到循环被 push 的情况。

另外,最好判断 Array.isArray(arr[i]) 而不是判断它是否是数字。

根据以上意见你的代码改成如下是正常的:

function getArray(arr) {
    var arrs = [];
    for(var i=0,l=arr.length;i<l;i++) {
        if(!Array.isArray(arr[i])) arrs.push(arr[i]);
        else arrs = arrs.concat( getArray(arr[i]) );
    }
    return arrs;
}
ringa_lee

第一个程序大部是正确的,除了 concat 那里。concat 不改变原数据,只是返回一个新的结果数组,作个实验:

javascriptvar a = [1,2,3]
var b = a.concat([4,5])
console.log(a, b)

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

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