警告:可能不是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]
])