js递归函数返回值

1.为什么这个递归函数没有把最后一项数组深拷贝完成。我的思路哪里出现了问题,请大家指点一下,这个递归函数一直晕
代码:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
        <script type="text/javascript">
            var a=[1,2,3,4,5,[1,2,3,4]];
            var j=[];
            function copyarr(obj){
                var n=obj instanceof Array;
                for (var i=0;i<obj.length;i++) {
                    if(typeof obj[i]=='object'){
                        copyarr(obj[i]);
                    }else{
                        j[i]=obj[i];
                    }
                }
                return j;
            }
            copyarr(a);
            console.log(j)[1,2,3,4,5]
        </script>
    </body>
</html>
阅读 5.8k
3 个回答

因为在copyarr(obj[i]);的时候你没有赋值为j[i],还有就是j这个数组应该是一个中间变量,用来保存a的子元素中也存在数组的情况,因为你这个copyarr这个函数是返回了j,所以不用担心函数执行的结果不正确。
你可以试试这样:

<script type="text/javascript">
  var a=[1,2,3,4,5,[1,2,3,4]];
  // var j=[];
  function copyarr(obj){
    var j = [];
    var n=obj instanceof Array;
    for (var i=0;i<obj.length;i++) {
      if(typeof obj[i]=='object'){
        // (obj[i]);
        j[i] = copyarr(obj[i]);
      }else{
        j[i]=obj[i];
      }
    }
    return j;
  }
  var r = copyarr(a);
  console.log(r)//[1,2,3,4,5]
</script>
if(typeof obj[i]=='object'){
     copyarr(obj[i]);
 }else{
     j[i]=obj[i];
 }
 1.如果if成立了.那么会把二维数组[1,2,3,4]传进去重新执行.
 2.重新执行,那么i=0, j[i]=obj[i] 就变成这样 j[0] = obj[0], 会把第一次的值覆盖.
 3.这块j数组的下标就不能是i, 换成j[j.length-1].就不会覆盖原来的值.

你把内部的数组 [1,2,3,4] 改成 [6,7,8,9] 你就知道为什么了。

得到的结果是: [6, 7, 8, 9, 5]

其实导致的原因 还是第二次循环的 时候 j[i] 造成的 原因

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题