2014-01-20 1 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; 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^