2016-02-28 83 views
3

我試圖遞歸地實現數組展平函數。這裏是代碼:遞歸地展開數組

function flatten(arr) { 
    var flatArr = []; 
    for (var i = 0; i < arr.length; i++) { 
    if (arr[i] instanceof Array) { 
     flatArr.concat(flatten(arr[i])); 
    } else { 
     flatArr.push(arr[i]); 
    } 
    } 
    return flatArr; 
} 


console.log(flatten([1, 2, 3, 4, [5]])); 
/* 
result: [1, 2, 3, 4] 
expected: [1, 2, 3, 4, 5] 
*/ 

但我不知道爲什麼結果是不正確的。請幫我解釋一下。

+0

問題是您沒有將'.concat'返回的數組賦值給''flatArr' var。在我的答案中看到一個工作示例。 –

回答

6

concat()方法返回一個新陣列包含在陣列上 調用它與陣列(一個或多個)和/或值(S) 作爲參數提供接合的。

flatArr.concat(...)不會改變flatArr ......你需要指定它像這樣:

flatArr = flatArr.concat('flatten(arr[i]));

這裏是3級深陣列工作的例子:

function flatten(arr) { 
 
    var flatArr = []; 
 
    for (var i = 0; i < arr.length; i++) { 
 
    if (arr[i] instanceof Array) { 
 
     flatArr = flatArr.concat(flatten(arr[i])); 
 
    } else { 
 
     flatArr.push(arr[i]); 
 
    } 
 
    } 
 
    return flatArr; 
 
} 
 

 
var arr = [1,2,3,4,[5,6,[7,8]]]; 
 
var flatten = flatten(arr); 
 

 
$('#result').html(JSON.stringify(flatten));
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div id="result"></div>

你可以閱讀更多關於Array.concat function這裏

4

你必須執行concat之後將返回的array

if (arr[i] instanceof Array) { 
     flatArr = flatArr.concat(flatten(arr[i])); 

concat不會編輯源陣列。它會給你一個新的副本。所以我們必須手動將它分配回source array

2

也許你喜歡一個真正的遞歸解決方案:

function flatten(arr) { 
 
    if (!arr.length) { 
 
     return []; 
 
    } 
 
    var a = arr.shift(); 
 
    return (Array.isArray(a) ? flatten(a) : [a]).concat(flatten(arr)); 
 
} 
 

 
document.write('<pre>' + JSON.stringify(flatten([1, 2, 3, 4, [5]])) + '</pre>'); 
 
document.write('<pre>' + JSON.stringify(flatten([1, [2, 3, [4, 5]], 6, 7, [8]])) + '</pre>');

0

我看到你試圖編寫自己的函數來做到這一點,這是太棒了。但是,有一個叫lodash夢幻般的框架,具有萬噸的輔助功能這樣的,就是例證flattenDeep

https://lodash.com/docs#flattenDeep

0

循環數組,直到所有的項目將扁平化,這是一個不同的解決方案,不正是要求在題。

// loop until all items are flatten 
for (var i = 0, len = data.length; i < len; i++) { 
    if (Array.isArray(data[i])) { 
     // flatten until there are no more nested 
     data = data.concat.apply([], data); 
     i--; 
     len = data.length; 
    } 
}