2017-03-01 74 views
0

首次發佈。抱歉格式不正確。我試圖讓我的功能工作。目前的問題是遞歸函數在第一個數組元素被調用時會立即停止。即使在調用數組後,我仍然需要它繼續前進。我想將數組展平。修復使用包含其他數組的元素的數組的遞歸函數。它生成一個沒有其他數組作爲元素的數組

function steamrollArray(arr) { 
    var newArr=[]; 
    //return Array.isArray(arr[2]); 

    //takes an array of which some elements will also be arrays and pushes its non-array elements to a new array (newArr) 
    function recurseArr(a){ 
     for (i=0; i<a.length; i++){ 
     //recursion where you take the array element (also an array) and apply the same function until you get an element 
     if(Array.isArray(a[i])){ 
      //&& i==a.length 
      recurseArr(a[i]); 
     } 
     //case where the original array element is not an array but an element already 
     else{ 
      newArr.push(a[i]); 
     } 
     } 
    } 
    //end of recurseArr 

    recurseArr(arr); 
    return newArr; 
} 

steamrollArray([1, 2, [2, 3], 2, [[[4]]]]); 

期望的輸出:[1,2,2,3,2,4]

+0

是你的意圖扁平化陣列?即要求的輸出是:[1,2,3,2,4]? – jgr0

+0

您可以請您發佈您想要的最終期望輸出。 – sailesh

+0

你必須停止在你的代碼元素之間放置這麼多行。您還需要使用一致的格式和縮進。不要混合標籤和空格。在stackoverflow上空間效果最好。沒有人可以看到你的代碼在做什麼,否則。 – ErikE

回答

1

你有兩個問題。

  1. 您正在混合兩種樣式的輸出。一方面,它看起來像你的函數返回值。但另一方面,它看起來最終的輸出應該來自newArr。實際上,代碼大部分是正確的,但你需要堅持使用newArr範例,並停止嘗試從內部函數返回。

    解決這個問題是這樣的:

    if(Array.isArray(a[i])){ 
        //&& i==a.length 
        recurseArr(a[i]); // get rid of `return` 
    } 
    

    這:

    return newArr; // remove this 
    

    這:

    // return recurseArr(arr); // don't do this 
    recurseArr(arr); 
    return newArr; 
    
  2. 你不varlet聲明你的計數器變量i 。這意味着它沒有函數範圍,但實際上是全局範圍的成員,如瀏覽器中的window或Node中的其他內容,因此您要在每個循環中修改相同的i實例(就像您已在外函數之前聲明var i)。

使得無論這些變化,現在產量(評論更容易理解刪除):

function steamrollArray(arr) { 
    let newArr = []; 

    function recurseArr(a) { 
     for (let i = 0; i < a.length; i += 1) { 
     if (Array.isArray(a[i])) { 
      recurseArr(a[i]); 
     } 
     else { 
      newArr.push(a[i]); 
     } 
     } 
    } 
    recurseArr(arr); 
    return newArr; 
} 

這完美的作品。

+0

如果我進行這些編輯,它似乎將我送入無限循環。我是否也應該消除遞歸函數內的return newArr? –

+0

是的,沒錯。嘗試刪除它。 – ErikE

+0

另外,我不需要我的遞歸函數中的某種回報?否則,輸出將會是不確定的,對嗎? –

0

主要問題是你的循環內部有return語句。 The return statement exits your for loop

如果你的主要目的就是擊敗陣,你是關閉使用工具庫一樣lodashramda,其中扁平化只是一個更好的:

R.flatten([1, 2, [2, 3], 2, [[[4]]]]) 
+0

謝謝!不幸的是,我需要用基本的javascript創建我自己的功能(這是一門課程)。我在遞歸函數中消除了返回值。但無論我嘗試過什麼,我都無法讓它停止無限循環。 –

+0

@DavidMorales我將這個問題標記爲[在JavaScript中合併/拼合數組數組]的一個副本(http://stackoverflow.com/questions/10865025/merge-flatten-an-array-of-arrays-in-javascript ) - 那裏有無數的答案,可以幫助你實現你的目標 - 即使是你的目標也是如此。 – naomik

+0

除了你所指的鏈接不是我想要做的。我的函數需要一個數組,它的元素本身就是數組,因此一個簡單的concat不會使數組扁平化。我也想弄清楚爲什麼我的特殊功能不起作用。我可以將其他人的解決方案複製到這個扁平化問題上,但我想知道我在做什麼錯誤。謝謝! –

相關問題