2014-01-20 58 views
0

我一直在想我是否可以消除下面的函數中的重複行,但一直無法到達非遞歸解決方案。是否可以非遞歸編寫此函數而沒有冗餘行?

只是出於好奇,有沒有辦法消除重複的行,但沒有遞歸?

function accumulateOverProtos(obj, propName) { 
    var accumulator = []                                          
    if (obj.hasOwnProperty(propName)) accumulator.push(obj[propName])                               
    while (obj = Object.getPrototypeOf(obj)) {                                     
    if (obj.hasOwnProperty(propName)) accumulator.push(obj[propName])                               
    }                                               
    return accumulator                                  
} 

此外,任何人都可以指點我對這種事情的一些閱讀?這個問題叫什麼?

+1

?? ??我在代碼中看不到任何遞歸。 – Pointy

+0

沒有遞歸,但我已經到達了沒有冗餘的遞歸解決方案。只是沒有發佈。 –

+0

您正在尋找'do while'循環。 – SLaks

回答

1

你可以只使用一個簡單的循環for

function accumulateOverProtos(obj, propName) { 
    var accumulator = [];               
    for (; obj; obj = Object.getPrototypeOf(obj)) 
    if (obj.hasOwnProperty(propName)) accumulator.push(obj[propName]); 
    return accumulator; 
} 
+0

我一直想知道'for'循環的用法 - 其中沒有初始化表達式 - 很長一段時間。這幾乎是一個更高性能的'do' /'while'(僅僅因爲這看起來就是jsperf中的「更高性能」)。 –

+1

@dimadima我懷疑有性能差異。這只是一個偏好或風格的問題。 – Pointy

3

一個完美的使用案例do...while

function accumulateOverProtos(obj, propName) { 
    var accumulator = []; 

    do { 
     if (obj.hasOwnProperty(propName)) accumulator.push(obj[propName]); 
    } while (obj = Object.getPrototypeOf(obj)); 

    return accumulator; 
}