2016-04-23 212 views
0

我正在在freeCodeCamp 的壓路機篝火我想不通,爲什麼我的代碼不工作 ,它只是在一個陣列拼合一個嵌套的數組

function steamrollArray(arr) { 
    // I'm a steamroller, baby 


    var flat = []; 

    for(i=0; i < arr.length; i++){ 
     if(Array.isArray(arr[i])){ 
      flat = flat.concat(steamrollArray(arr[i])); 
     } else { 
      flat.push(arr[i]); 
     } 
    } // end of the for loop 


    return flat; 
} 
+0

數組可以任意深嵌套嗎? –

+0

是的,它可以! 爲什麼? –

+6

'var i = 0'。 [沒有'var','i'是一個全局變量](http://stackoverflow.com/questions/1470488/what-is-the-function-of-the-var-keyword-and-when-to-use因此每次調用'steamrollArray'都會共享並修改它。 –

回答

0

看起來像喬納森無二的第一要素是正確的,我做我所有的嵌套數組 共享,所以只是改變我對VAR我

0

由於被@Jonathan評論的問題是,你用一個計數器i未在函數中聲明,因此全球性的。其結果是遞歸調用將改變呼叫者的i

 
function steamrollArray(arr) { 
    // I'm a steamroller, baby 
    var flat = []; 

    for(var i=0; i < arr.length; i++){ 
     if(Array.isArray(arr[i])){ 
      flat = flat.concat(steamrollArray(arr[i])); 
     } else { 
      flat.push(arr[i]); 
     } 
    } // end of the for loop 
    return flat; 
} 

的第二個挑戰是但使代碼在時間和存儲器的效率更高。這可以通過將列表結構的數量限制爲1來完成。您可以通過使用一個稱爲累加器的概念來完成此操作:通過遞歸過程更新的變量。首先,我們需要初始化變量:

 
function steamrollArray(arr) { 
    return steamer(arr,[]); 
} 

在這種情況下,累加器是結果,以及,和我們初始化該結果作爲一個空數組。顯然,我們還需要實現steamer功能:

 
function steamer (arr,target) { 
    if(Array.isArray(arr)) { 
    var n = arr.length; 
    for(var i = 0; i < n; i++) { 
     steamer(arr[i],target); 
    } 
    } else { 
    target.push(arr); 
    } 
    return target; 
} 

什麼人做的是傳遞目標通過陣列樹的遞歸枚舉。如果該值成爲標量(Array.isArray返回false),我們將該元素添加到target的末尾;否則我們執行遞歸調用。

此功能所做的最後一件事情是在初始steamer調用target將填充嵌套列表中的所有元素後返回target

優點是我們不需要昂貴的concat函數,但只能使用push函數O(n)次。如果我們抽象構建一個數組所需的處理時間(假設push工作在O(1)時間),算法現在可以在O(n)時間和內存中使用n列表中的葉數樹。

0

嘗試在下面的方法中遞歸數組,使用res []保存結果;

function steamrollArray(arr) { 
    var res=[]; 
    function recurse(array) 
    { 
    for(var i = 0; i < array.length; i++) 
    { 
     if(!Array.isArray(array[i])) 
     res.push(array[i]); 
     else 
     recurse(array[i]); 
    } 
    } 
    recurse(arr); 
    return res; 
} 
0

副作用,ES6,可以實現使用以迭代的圖案的深弄平.splice

function flatten(arr) { 
    let i = 0; 
    while (i < arr.length) { 
     if (Array.isArray(arr[i])) arr.splice(i, 1, ...arr[i]); 
     else ++i; 
    } 
    return arr; 
} 

例如使用

flatten([1, [2], [[3]], [4, [5, [6]]], [[[7], 8], 9]]); 
// [1, 2, 3, 4, 5, 6, 7, 8, 9] 

如果你不希望的副作用,.slice之前,

functon flatClone(arr) { 
    return flatten(arr.splice()); 
} 
0
function steamrollArray(arr) { 
    return String(arr).split(',').map(Number); } 

如果它工作在所有的情況下,它的工作原理爲 「扁平化」 上面的例子,讓我知道如果我錯過了什麼。