JavaScript通过字符计数过滤值数组

JavaScript通过字符计数过滤值数组,javascript,jquery,arrays,filter,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

这应该是一个快捷的方法,但我不明白为什么这一点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个字符)偶尔会以某种方式进入数组。如果您有任何建议,我们将不胜感激。

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

试一试


这样,它将在任意数量的空格上拆分,而不是在每个空格上拆分。除了迭代问题之外,如果键入多个空格,还可能会看到意外的条目

试一试


这样,它将在任意数量的空格上拆分,而不是在每个空格上拆分。问题是,您在删除元素时正在进行迭代。考虑这个数组:

["he", "l", "lo world"]
最初,循环从索引0开始,并从数组中删除he。现在,新的阵列正在运行

["l", "lo world"]
在下一次迭代中,我将是1,您将检查lo world的长度,从而完全忽略l字符串

使用数组中的方法删除不需要的元素

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

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

["he", "l", "lo world"]
最初,循环从索引0开始,并从数组中删除he。现在,新的阵列正在运行

["l", "lo world"]
在下一次迭代中,我将是1,您将检查lo world的长度,从而完全忽略l字符串

使用数组中的方法删除不需要的元素

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

问题是,您在向前计数时正在对数组进行切片。想想看……如果你从数组中取出一个索引点,从而将它缩短一个,增加i并继续移动到下一个,实际上移动的比你想要的更远,完全丢失了下一个索引。增量i-,从query.length-1开始,并使条件i>=0。有关此操作的示例,请在此处查看:

CSS:

HTML:

Javascript:


问题是,您在向前计数时正在对数组进行切片。想想看……如果你从数组中取出一个索引点,从而将它缩短一个,增加i并继续移动到下一个,实际上移动的比你想要的更远,完全丢失了下一个索引。增量i-,从query.length-1开始,并使条件i>=0。有关此操作的示例,请在此处查看:

CSS:

HTML:

Javascript:


嘿,我想你应该使用一个新的数组作为结果。因为您正在移除数组中的元素。长度改变了。这是我的解决办法

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

嘿,我想你应该使用一个新的数组作为结果。因为您正在移除数组中的元素。长度改变了。这是我的解决办法

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

试试这段代码,它可以去掉任何3个字符的单词,并确保没有创建空数组元素

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

试试这段代码,它可以去掉任何3个字符的单词,并确保没有创建空数组元素

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

是的,这很有效。或者从头开始构建一个新的数组,如下面的几个答案所示。感谢大家的快速反应。。。注意它的兼容性;是的,这很有效。或者从头开始构建一个新的数组,如下面的几个答案所示。感谢大家的快速反应。。。注意它的兼容性;