2015-06-02 84 views
0

我想獲取嵌套數組中的所有子數組,包括每個深度(包括原始輸入數組)的新數組,並將它們放入一個新數組中。JS - 將嵌套數組分爲一個包含數組

輸入:

var array = ["cat", ["dog", ["rabbit"]], "hamster"] 

輸出:

newArray = [ 
      ["cat", ["dog", ["rabbit"]], "hamster"], 
      ["dog", ["rabbit"]], 
      ["rabbit"] 
      ] 

嘗試:

var unnest = function(array) { 
    var container = [array]; 
    for (var i in array) { 
     if (array[i] instanceof Array) { 
      container.push(array[i]); 
     } 
    } 
    return container 
} 

我知道這需要某種形式的迭代或遞歸的過程,但是這就是我卡住了(我是JavaScript新手)。謝謝。

+1

那麼你有什麼嘗試呢? – Oka

+0

@Oka對不起,只是添加了我的嘗試解決方案。 – ChrisG7891

回答

0

你很近!只有一件事需要改變:將你的for循環包裝在一個函數中,這樣你可以遞歸地調用它。這是一種做法。

var unnest = function(array) { 
    var container = [array]; 

    var collectNestedArrays = function(array) { 
    array.forEach(function(x) { 
     if (x instanceof Array) { 
     container.push(x); 
     collectNestedArrays(x); 
     } 
    }); 
    }; 

    collectNestedArrays(array); 

    return container; 
}; 
+0

謝謝@troyastorino。當它涉及到遞歸部分時,我碰壁了,但這有很大幫助。 – ChrisG7891

0

因爲我們遍歷數組並創建父陣列和樹中的每個子數組元素,這是一個問題達是最好用遞歸算法DFS解決。

function unnest(src) { 
    // overload the parameters and take the target array as a second argument. 
    // this helps us avoid having nested functions, improve performance 
    // and reduce boilerplate 
    var target = arguments[1] || []; 

    // add the current array to the target array 
    target.push(src); 

    // iterate on the parent array and recursively call our function, 
    // assigning the child array, and the target array as function parameters 
    src.forEach(function (node) { 
    if (node instanceof Array) { 
     unnest(node, target); 
    } 
    }); 
    return target; 
} 
+0

好的答案提供了對代碼的解釋 –

0

這是一個遞歸實現。

var unNest = function(array) { 
    // Create a results array to store your new array 
    var resultsArr = []; 
    // Recursive function that accepts an array 
    var recurse = function(array) { 
    // Push the passed-in array to our results array 
    resultsArr.push(array); 
    // Iterate over the passed-in array 
    for (var i = 0; i < array.length; i++) { 
     // If an element of this array happens to also be an array, 
     if (Array.isArray(array[i])) { 
     // Run the recursive function, passing in that specific element which happens to be an array 
     recurse(array[i]); 
     } 
    } 
    } 
    // Invoke our recurse function, passing in the original array that unNest takes in 
    recurse(array); 
    // Return the results array 
    return resultsArr; 
} 
+0

啊這很清楚。感謝您的代碼中的評論。這有助於達成巨大的交易。 – ChrisG7891

+0

很高興你發現它有幫助! –