Javascript indexOf不是一个函数
我有一个简单的kata: 给定项目序列和该序列中的特定项目,立即返回指定项目后面的项目。如果项目在一个序列中出现多次,请在第一次出现后返回该项目。这适用于任何类型的序列 我的职能如下:Javascript indexOf不是一个函数,javascript,Javascript,我有一个简单的kata: 给定项目序列和该序列中的特定项目,立即返回指定项目后面的项目。如果项目在一个序列中出现多次,请在第一次出现后返回该项目。这适用于任何类型的序列 我的职能如下: function nextItem(xs, item) { for(const current of xs) { if(current === item) { const key = xs.indexOf(current); return xs[
function nextItem(xs, item) {
for(const current of xs) {
if(current === item) {
const key = xs.indexOf(current);
return xs[key+1];
}
}
}
测试示例:
Test.assertEquals(nextItem([1, 2, 3, 4, 5, 6, 7, 8], 5), 6);
Test.assertEquals(nextItem(['a', 'b', 'c'], 'd'), undefined);
Test.assertEquals(nextItem(['a', 'b', 'c'], 'c'), undefined);
Test.assertEquals(nextItem("testing", "t"), "e");
function* countFrom(n) { for (let i = n; ; ++i) yield i; }
Test.assertEquals(nextItem(countFrom(1), 12), 13);
一些测试通过了,但我得到了以下错误:
TypeError: xs.indexOf is not a function
at nextItem
at /home/codewarrior/index.js:30:19
at /home/codewarrior/index.js:37:5
at Object.handleError
<anonymous>
TypeError:xs.indexOf不是函数
在nextItem
at/home/codewarior/index.js:30:19
at/home/codewarrior/index.js:37:5
at Object.handleError
是因为indexof希望接收字符串作为输入吗?
谢谢 TypeError:xs.indexOf不是一个函数
表示您正在对非数组的对象调用indexOf()
。在调用indexOf
之前,使用console.log(xs)
检查输入内容
您的示例没有为我抛出错误(省略测试部分,并调用nextItem([1,2,3,4,5,6,7,8],5)
)。测试提供的值似乎不是数组或字符串。您可以使用一种不需要indexOf()
的算法,如下所示
function nextItem(xs, item) {
let check = false;
for(let i of xs){
if(check === true) return i
if(item === i) check = true;
}
}
您得到了一个indexOf
错误,因为在测试中使用了要测试的项目没有indexOf
。在这种情况下,您不需要使用索引of
(当然可以,但您必须使用类型of
)来测试是否存在此类函数)。您可以改为使用标志来确定是否找到某个项。因此,当找到该项时,在下一个循环中,您必须返回当前值(实际上是下一个值)。检查下面的算法以获得指导
found = false
loop each item
if (found)
return current item
if (current item == lookup item)
found = true
end loop
return undefined
使用这些参数调用nextItem
不会导致您描述的错误..?我可能用我的示例误导了您,我这样做只是为了让您了解预期结果。我现在添加了更多,但实际上在codewar网站上,他们没有向您显示失败的测试。也许您是对的,可能有一个测试,其中函数作为输入接收与字符串/数组不同的内容。