indexOf不是JS kata函数

时间:2019-03-05 08:36:54

标签: javascript

我有这个简单的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希望接收字符串作为输入吗? 谢谢!

3 个答案:

答案 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)

测试提供的值似乎不是arraystring之外的值。您可能会使用不需要indexOf()的算法,如下所示

function nextItem(xs, item) {
  let check = false;
  for(let i of xs){
    if(check === true) return i
    if(item === i) check = true;
  }
}