警告:可能不是typeError。做脚本算法很有趣。尝试学习/解决问题的方法=>我注释掉了未定义的数组。我不知道为什么会引发错误。



function arrayManipulation(n, queries) {

  var array = new Array(n).fill(0)
  var x = 0
  var recurring = (argmnt, query, y) => {

    //problem start here
    var start = query[0],
    end = query[1]
    //problem end somewhere else

    var newArg = argmnt.map((el, index) =>{
      if(index+1 >= start && index+1 <= end){
        return query[2] + el
      }else{
        return el
      }
    })
    console.log(newArg)
    if ( y < queries.length ){
      y += 1
      recurring(newArg, queries[y], y)
    }else{
      return newArg
    }
  }

  var solution = recurring(array, queries[x], x)
}

arrayManipulation(5, [[1, 2, 100], [2, 5, 100], [3, 4, 100]])





尽管脚本可以正常运行,并提供所需的输出。它在节点中引发stderr或在JS中引发typeerror。我只想知道为什么。

最佳答案

问题出在您的y变量上。在检查y < queries.length中,您首先检查长度,然后增加。

如果数组的长度为3(如示例中所示),则将检查y是否小于3,如果其为2,则通过测试,并递增为3然后将queries[3]传递给下一个recurring()调用。但是,queries的最后一个元素是queries[2]。因此,queries[3]undefined,在函数内部,您尝试使用query[0]来访问0的属性undefined。那是错误。



function arrayManipulation(n, queries) {

    var array = new Array(n).fill(0)
    var x = 0
    var recurring = (argmnt, query, y) => {

    //problem start here
        var start = query[0],
            end = query[1]
    //problem end somewhere else

        var newArg = argmnt.map((el, index) =>{
            if(index+1 >= start && index+1 <= end){
                return query[2] + el
            }else{
                return el
            }
        })
        console.log(newArg)
        y += 1 // now is here
        if ( y < queries.length ){

            // was here
            recurring(newArg, queries[y], y)
        }else{
            return newArg
        }
    }
    var solution = recurring(array, queries[x], x)

}

arrayManipulation(5, [[1, 2, 100],
[2, 5, 100],
[3, 4, 100]])





您有两种选择:要么先递增然后进行检查(如上面的代码段所示),或者检查queries.length - 1,如下所示:

if ( y < queries.length - 1 ){




另外,还有一些优化。您不需要y变量。它基本上只是x,但作为参数传递。您可以从x访问recurring(),因此不妨使用它:



function arrayManipulation(n, queries) {

  var array = new Array(n).fill(0)
  var x = 0
  var recurring = (argmnt, query) => {

    //problem start here
    var start = query[0],
      end = query[1]
    //problem end somewhere else

    var newArg = argmnt.map((el, index) => {
      if (index + 1 >= start && index + 1 <= end) {
        return query[2] + el
      } else {
        return el
      }
    })
    console.log(newArg)
    x += 1
    if (x < queries.length) {
      recurring(newArg, queries[x], x)
    } else {
      return newArg
    }
  }

  var solution = recurring(array, queries[x])
}

arrayManipulation(5, [
  [1, 2, 100],
  [2, 5, 100],
  [3, 4, 100]
])

09-25 16:55