【问题标题】:JavaScript filtering an array of <input> values by character countJavaScript 按字符数过滤 <input> 值数组
【发布时间】:2011-04-15 12:56:36
【问题描述】:

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

【问题讨论】:

    标签: javascript jquery arrays filter


    【解决方案1】:

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

    试试

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

    这样它会在任意数量的空间上分割,而不是每个单独的空间

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 是的,这行得通。或者从下面的几个答案中看到的从头开始构建一个新数组也可以。感谢大家的快速响应...... zounds。
      • 小心它的兼容性 ;) filter
      【解决方案3】:

      问题是您在向前计数时对数组进行切片。想想看……如果你从数组中取出一个索引点,从而将它缩短一个,增加 i 并移动到下一个实际上比你想要的移动了一个,完全错过了下一个索引。递增i--,从query.length-1开始,条件为i&gt;=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>");
      }
      

      【讨论】:

        【解决方案4】:

        嘿,我认为您应该为结果使用一个新数组。因为您要删除数组中的元素。长度改变了。这是我的解决方案

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

        【讨论】:

          【解决方案5】:

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2019-12-30
            • 1970-01-01
            • 2015-03-24
            • 1970-01-01
            • 2022-08-18
            • 2018-12-29
            • 1970-01-01
            相关资源
            最近更新 更多