这应该是一个快速的,但我正在摸不着为什么这个JavaScript不适合我。目标是获取输入框的值(由空格分隔的单词串),将这些单词列为数组中的项目,并删除少于3个字符的单词:
var typed = $('input').val();
var query = typed.split(" ");
var i=0;
for (i=0; i<query.length; i++) {
if (query[i].length < 3) {
query.splice(i,1);
}
}
让输入框运行onkeyup
它似乎有效,但只有大约50%的时间(1和2个字符的字符串有时会以某种方式进入数组)。任何建议都会非常感激。
答案 0 :(得分:3)
问题是你在删除元素时进行迭代。考虑一下这个数组:
["he", "l", "lo world"]
最初,您的循环从索引0
开始,并从数组中删除"he"
。现在新的数组是
["l", "lo world"]
在下一次迭代中,i
将为1
,您将检查"lo world"
的长度,从而完全忽略"l"
字符串。
使用Array中的filter
方法删除不需要的元素。
var biggerWords = query.filter(function(word) {
return word.length >= 3;
});
答案 1 :(得分:1)
除了迭代问题,如果键入多个空格
,您还可能会看到意外的条目试
var query = typed.split(/\s+/);
这样它就会分割成任意数量的空格,而不是每个空格
答案 2 :(得分:1)
问题是你在向前计数时正在切片。想一想......如果你从数组中取出一个索引点,从而将它缩短一个,递增i并继续前进到下一个实际上比你想要的更远,完全错过了下一个索引。增加i--
,从query.length-1
开始,并使条件为i>=0
。有关此操作的示例,请在此处查看:
<强> CSS 强>:
input {
width:300px;
}
<强> HTML 强>:
<input id="textbox" type="text" />
<div id="message"></div>
<强>的Javascript 强>:
$(document).ready(function() {
$('#textbox').keyup(checkStrings);
});
function checkStrings(e) {
var typed = $('#textbox').val();
if (typed == "") return false;
var query = typed.split(" ");
var querylen = query.length;
var acceptedWords = '';
var badWords = '';
for (var i = querylen-1; i >= 0; i--) {
if (query[i].length < 3) {
badWords += query[i] + " ";
} else {
acceptedWords += query.splice(i,1) + " ";
}
}
$('#message').html("<div>Bad words are: " + badWords + "</div>" +
"<div>Good words are: " + acceptedWords + "</div>");
}
答案 3 :(得分:1)
尝试使用此代码,它可以删除任何3个字符的单词,并确保不会创建空数组元素。
typed.replace(/(\b)\w{1,3}\b/g,"$1");
var query = typed.split(/\s+/);
答案 4 :(得分:0)
var typed = "dacda cdac cd k foorar";
var query = typed.split(" ");
var i=0;
var result = [];
for (i=0; i<query.length; i++) {
if (query[i].length >= 3) {
result.push(query[i]);
}
}