2017-03-19 132 views
0

我一直主要使用Python進行編程。今年,我學會了如何使用它進行遞歸。在JavaScript中處理遞歸的最佳方法是什麼?

一個非常好的技術,我的教授教我的方法是使用列表理解像這樣:

def list_all(obj): 

    if not isinstance(obj, list): 
     return [obj] 
    else: 
     return sum([list_all(x) for x in obj], []) 

現在,我越來越多的使用JS,而不是Python的,我想知道什麼是特定的內置功能你可以用語言來幫助遞歸。我知道列表理解在JavaScript中被棄用,所以顯然我不能再使用它們了。在處理遞歸時,映射或過濾可以成爲列表理解的好替身嗎?如果不是,那麼什麼?

+2

*「我知道列表理解在JavaScript中被棄用」* - 誰告訴你的?我們什麼時候有過列表解析,爲什麼他們會被棄用? – Li357

+1

@AndrewLi:'[for(x [1,2,3])x * x]' - 在你的Firefox控制檯中試試這個;) – georg

+1

@georg我明白未來的ES版本正在實現列表解析,但它們不是標準化。問題在於OP聲稱他們之前已經將其作爲標準存在,並已被棄用,這是不正確的。 – Li357

回答

4

Array comprehensions由Mozilla在2007年提出並實施爲其「Javascript 1.7」計劃(支持隨後即將到來,後來被遺棄的ES4)的一部分,但不幸的是,它們並沒有達到目前的標準,像Object.getOwnPropertySymbolsOrSomeOtherUnreadableMess()在可重寫性和效率方面更重要)。所以,在JS你不得不求助於.map對這種東西:

let list_all = obj => { 
    if (!Array.isArray(obj)) 
     return [obj]; 
    else 
     return [].concat(...obj.map(list_all)) 
} 
1

在JavaScript中,你的確可以使用數組原型方法,如.map().reduce().some().every().filter(),把事情做好,也遞歸調用數組。在ES6中,擴展語法(很像Python中的*)允許將數組轉換爲函數參數。在JavaScript中,數組與.concat()方法相連,而不是Python的+,並且三元運算符比Python中的... if ... else ...運算符更經常使用。

這裏是ES6代碼,做你的榜樣Python腳本做什麼:

function flattenArray(obj) { 
 
    return Array.isArray(obj) 
 
     ? [].concat(...obj.map(flattenArray)) 
 
     : [obj]; 
 
} 
 
// Sample call: 
 
var res = flattenArray([1,[2,3],[4,[5,6],7],8]); 
 

 
console.log(res);

0

嗯,這是一個非常廣泛的問題,但在一般情況下,JavaScript的適合於一些非常實用功能解決方案在下面的代碼中,我將flatten定義爲一個非常簡單的遞歸過程,它在數組的頭部進行簡單的案例分析。對我來說,這比其他答案中提供的例子更好 - [].concat - 同樣,Array.prototype.map也沒有錯,但我認爲在這裏使用它沒有任何好處。

const flatten = ([x,...xs]) => { 
 
    if (x === undefined) 
 
    return [] 
 
    else if (x.constructor === Array) 
 
    return [...flatten(x), ...flatten(xs)] 
 
    else 
 
    return [x, ...flatten(xs)] 
 
} 
 

 
let result = flatten([1,[2,3],[4,[5,6],7],8]) 
 

 
console.log(result) 
 
// [ 1, 2, 3, 4, 5, 6, 7, 8 ]

但是,如果你想有一個更深入的答案,我想看看一個答案我張貼在這裏:

我有關於遞歸和數組操作的其他答案可能對您有用

我希望對你們有幫助。如果您有任何問題,請告訴我。

相關問題