2010-09-22 76 views
1

这应该是一个快速的过程,但我为了这个JavaScript为什么不适用于我而头脑发热。目标是采取一个输入框(由空格分隔单词的字符串)的值,在阵列中列出这些字作为项,并删除那些少于3个字符:JavaScript按字符计数过滤<input>值的数组

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个字符的字符串偶尔会进入阵列)。任何建议将非常感激。

回答

3

问题是,您正在迭代,同时删除元素。考虑这个数组:

["he", "l", "lo world"] 

最初的循环开始于指数0,并从阵列中删除"he"。现在,新的阵列是

["l", "lo world"] 

在下一次迭代i1,你会检查"lo world"的长度,从而完全忽略了"l"字符串。

在Array中使用filter方法删除不需要的元素。

var biggerWords = query.filter(function(word) { 
    return word.length >= 3; 
}); 
+0

是的,这个工程。或者从下面的几个答案中看到构建一个新的数组也是可行的。感谢大家的快速回复... zounds。 – Jope 2010-09-22 04:44:18

+0

要注意它的兼容性;)[filter](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/filter) – Reigel 2010-09-22 04:49:39

1

除了迭代问题,你也可能会看到意外的条目如果您键入多个空格

尝试

var query = typed.split(/\s+/); 

这样,它会分裂的任何数量的空格,而不是每一个单独

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

试试这个代码,它获得的摆脱任何3分字符的话,以及确保没有创建空数组元素。

typed.replace(/(\b)\w{1,3}\b/g,"$1"); 
var query = typed.split(/\s+/);