是否可以非递归地编写此函数而没有冗余线?

时间:2014-01-20 16:59:59

标签: javascript recursion

我一直想知道我是否可以消除下面函数中的重复行,但是无法达到非递归解决方案。

出于好奇,有没有办法消除重复的行,但没有递归?

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                                                                                                                                      
}

另外,有人能指点我这方面的一些阅读吗?这个问题叫什么问题?

2 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:1)

您可以使用简单的for循环:

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