JavaScript按字符数过滤<input />值数组

时间:2010-09-22 04:10:13

标签: javascript jquery arrays filter

这应该是一个快速的,但我正在摸不着为什么这个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个字符的字符串有时会以某种方式进入数组)。任何建议都会非常感激。

5 个答案:

答案 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。有关此操作的示例,请在此处查看:

http://jsfiddle.net/kcwjs/

<强> 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]);
  }
}