鍍金池/ 問答/HTML/ js遞歸函數(shù)返回值

js遞歸函數(shù)返回值

1.為什么這個(gè)遞歸函數(shù)沒有把最后一項(xiàng)數(shù)組深拷貝完成。我的思路哪里出現(xiàn)了問題,請(qǐng)大家指點(diǎn)一下,這個(gè)遞歸函數(shù)一直暈
代碼:

<!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>
回答
編輯回答
絯孑氣

你把內(nèi)部的數(shù)組 [1,2,3,4] 改成 [6,7,8,9] 你就知道為什么了。

得到的結(jié)果是: [6, 7, 8, 9, 5]

其實(shí)導(dǎo)致的原因 還是第二次循環(huán)的 時(shí)候 j[i] 造成的 原因

2017年1月21日 07:21
編輯回答
尐懶貓

因?yàn)樵?code>copyarr(obj[i]);的時(shí)候你沒有賦值為j[i],還有就是j這個(gè)數(shù)組應(yīng)該是一個(gè)中間變量,用來保存a的子元素中也存在數(shù)組的情況,因?yàn)槟氵@個(gè)copyarr這個(gè)函數(shù)是返回了j,所以不用擔(dān)心函數(shù)執(zhí)行的結(jié)果不正確。
你可以試試這樣:

<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>
2017年7月30日 17:13
編輯回答
終相守
if(typeof obj[i]=='object'){
     copyarr(obj[i]);
 }else{
     j[i]=obj[i];
 }
 1.如果if成立了.那么會(huì)把二維數(shù)組[1,2,3,4]傳進(jìn)去重新執(zhí)行.
 2.重新執(zhí)行,那么i=0, j[i]=obj[i] 就變成這樣 j[0] = obj[0], 會(huì)把第一次的值覆蓋.
 3.這塊j數(shù)組的下標(biāo)就不能是i, 換成j[j.length-1].就不會(huì)覆蓋原來的值.
2017年12月22日 05:53