javascript - indexOf不是一个功能

时间:2015-07-23 22:16:27

标签: javascript

我有这个事件......

   <textarea id="chat"> </textarea>
   <button type="button" onclick="play_song();">talk</button>

...触发以下function

   var input = function() {
           var chat = document.getElementById("chat").value.split(" ");
           return chat && console.log(chat);
        }

然后是function

   function setIntersection(a, b) {

      var result = [];

      for (var i = 0; i < a.length; i++) {
         if (b.indexOf(a[i]) !== -1 && result.indexOf(a[i]) === -1) {
            result.push(a[i]);
         }
      }
    return result;
   }

prototype function

   Song.prototype.lyricsIntersect = function(input) {


      var bestSong = null;
      var bestCount = -Infinity;

      for (var i in songs) {
        var currentCount = setIntersection(songs[i].lyrics, input).length;

    if (currentCount > bestCount) {
        bestSong = songs[i];
        bestCount = currentCount;
    }
}

return bestSong && bestSong.name;
}

代码在此结束:

   function play_song() {

    var id = Song.prototype.lyricsIntersect(input);
    var element = document.getElementById(id);
    element.play();
}

console.log返回:Uncaught TypeError: b.indexOf is not a function

如果我测试var input = ["one", "two"];,我会根据input对代码进行交集。

我错过了什么?

4 个答案:

答案 0 :(得分:3)

  

我错过了什么?

在这里,您将输入声明为全局并分配一个函数:

var input = function() {
    var chat = document.getElementById("chat").value.split(" ");
    return chat && console.log(chat);
}

我更喜欢函数声明,但每个都是自己的。

此处将输入作为参数传递给 Song.prototype.lyricsIntersect

var id = Song.prototype.lyricsIntersect(input);

将其分配给自己的变量 input

Song.prototype.lyricsIntersect = function(input) {

然后调用 setIntersection

    var currentCount = setIntersection(songs[i].lyrics, input).length;

然后在 setIntersection 中将其分配给 b 参数:

function setIntersection(a, b) {

并像对待数组一样对待:

     if (b.indexOf(a[i]) !== -1 && result.indexOf(a[i]) === -1) {

答案 1 :(得分:2)

var currentCount = setIntersection(songs[i].lyrics, input).length;

应该是

var currentCount = setIntersection(songs[i].lyrics, input()).length;

这也依赖于输入被纠正如下

var input = function() {
   var chat = document.getElementById("chat").value.split(" ");
   return chat;
}

答案 2 :(得分:1)

为了能够使用indexOf对象的Array功能,您的b变量必须是array。检查您的b类型。

这是doc regarding Array.prototype.indexOf()函数

修改

根据您提供的信息,b似乎是对input的引用。您需要确保inputarray。在您提供的情况下.. input实际上是一个函数,而不是array

答案 3 :(得分:0)

尝试尽可能简化示例,不会使用预期的参数调用您的函数(如前所述)(可能是错误的逻辑)。至于indexOf方法:

typeof [].indexOf // "function"

typeof ''.indexOf // "function"

实现iteration protocol的任何数据类型都应支持indexOf