我有这个事件......
<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
对代码进行交集。
我错过了什么?
答案 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
的引用。您需要确保input
是array
。在您提供的情况下.. input
实际上是一个函数,而不是array
。
答案 3 :(得分:0)
尝试尽可能简化示例,不会使用预期的参数调用您的函数(如前所述)(可能是错误的逻辑)。至于indexOf
方法:
typeof [].indexOf // "function"
typeof ''.indexOf // "function"
实现iteration protocol的任何数据类型都应支持indexOf
。