我有这个简单的kata: 给定一个项目序列和该序列中的特定项目,请在指定的项目之后立即返回该项目。如果该项目在一个序列中多次出现,则在第一次出现后返回该项目。这应该适用于任何类型的序列。
我的功能如下:
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>
也许您可以直接访问链接: https://www.codewars.com/kata/whats-up-next/train/javascript
是因为indexof希望接收字符串作为输入吗? 谢谢!
答案 0 :(得分:0)
TypeError: xs.indexOf is not a function
表示您正在非数组对象上调用indexOf()
。致电console.log(xs)
之前,请先使用indexOf
来检查输入内容。
您的示例不会给我带来错误(省去test
部分,而是调用nextItem([1, 2, 3, 4, 5, 6, 7, 8], 5)
)。
答案 1 :(得分:0)
由于在测试中使用了generator function,其中要测试的项目没有indexOf
,因此出现了indexOf
错误。在这种情况下,您不需要使用indexOf
(尽管您当然可以,但是您必须使用typeof
测试该功能是否存在)。您可以改用标志来确定是否找到项目。因此,找到项目后,在下一个循环中,您必须返回当前值(实际上是下一个值)。查看以下算法以获取指导。
found = false
loop each item
if (found)
return current item
if (current item == lookup item)
found = true
end loop
return undefined
答案 2 :(得分:-1)
测试提供的值似乎不是array
或string
之外的值。您可能会使用不需要indexOf()
的算法,如下所示
function nextItem(xs, item) {
let check = false;
for(let i of xs){
if(check === true) return i
if(item === i) check = true;
}
}