【问题标题】:Remove Whitespace-only Array Elements删除只有空格的数组元素
【发布时间】:2013-12-18 21:33:41
【问题描述】:

由于使用 array.splice 就地修改了数组,我怎样才能从数组中删除所有只有空格的元素而不抛出错误?使用 PHP,我们有 preg_grep,但我不知道如何在 JS 中正确执行此操作。

由于上述原因,以下将不起作用:

for (var i=0, l=src.length; i<l; i++) {

    if (src[i].match(/^[\s\t]{2,}$/) !== null) src.splice(i, 1);

}

错误:

未捕获的类型错误:无法调用未定义的方法“匹配”

【问题讨论】:

  • 您是真的想就地更改数组还是可以生成第二个过滤数组?

标签: javascript


【解决方案1】:

“从数组中删除仅包含空格的元素”的更好方法。

var array = ['1', ' ', 'c'];

array = array.filter(function(str) {
    return /\S/.test(str);
});

解释:

Array.prototype.filter 返回一个新数组,其中仅包含函数返回 true(或真值)的元素。

/\S/ 是匹配非空白字符的正则表达式。 /\S/.test(str) 返回 str 是否有非空白字符。

【讨论】:

  • 他在for循环的初始化部分有l=src.length,而不是测试部分。
  • Array.splice() 就地修改数组?请解释一下。
  • 在 4.5 小时的睡眠中运行让我错过了一个简单的问题,即我试图缓存数组长度,而实际上我不应该这样做。 >_
  • @tenub,这个答案将取决于空白元素在实践中出现的频率。 (例如很多,几乎从不等)。空白元素越多,filtersplice 更快。如果几乎没有空白元素,splice 会更快。
  • @tenub,缓存长度不是唯一的问题。当您从数组中删除一个项目时,它会将剩余的项目向下移动一个索引......因此,您将跳过向下移动到当前索引的项目,i
【解决方案2】:

另一个基于过滤器的变体 - 可重用(函数)

    function removeWhiteSpaceFromArray(array){
    return array.filter((item) => item != ' ');
}

【讨论】:

    【解决方案3】:

    const words = ['spray', 'limit', 'elite', 'exuberant', ' ', ''];
    
    const result = words.filter(word => word.trim().length > 0);
    
    console.log(result);

    【讨论】:

      【解决方案4】:

      a="删除空格"

      a.split(' ').join('').split('');
      

      它返回一个包含 {a="remove white spaces"} 中所有字符的数组,其中不包含“空格”字符。

      您可以分别测试每个方法的输出:split() 和 join()。

      【讨论】:

        【解决方案5】:

        您从数组中删除了一个减少数组长度的项目。您的循环继续,跳过了一些索引(那些被下移到已删除索引中的索引),并最终尝试访问新范围之外的索引。

        试试这个:

        var src = ["1"," ","2","3"];
        var i = src.length;    
        while(i--) !/\S/.test(src[i]) && src.splice(i, 1);
        console.log(src);

        【讨论】:

          【解决方案6】:

          只是简单地做这个例子

          // this is you array 
          let array = ["foo","bar","",""]
          
          // remove blanks in array 
          let array_new_value = array.join(" ").trim().split(' ');
          
          // Print to know if really works 
          console.log(array_new_value);
          

          希望对你有帮助!!

          【讨论】:

            【解决方案7】:

            对于新一代(即 ES2015):

            ['1', ' ', 'c'].filter(item => item.trim() !== '')
            

            More on trim()

            【讨论】:

              【解决方案8】:

              这是另一种方法。

              var data = JSON.parse(arrayval.split(/\s/).join(''));
              

              【讨论】:

              • 这不是问题所要求的。
              【解决方案9】:
              function clearSpace(arr){
                  for (var key in arr) {
                      if (arr[key] == "") {
                          arr.splice(key, 1)
                          clearSpace(arr)
                      }
                  }
              }
              var arr = ["","a","b","",""]
              clearSpace(arr)
              
              //I hope this helps you!!
              //Vu Tien Luong - 3GTEL
              

              【讨论】:

              • 请不要只发布代码作为答案,还要解释您的代码的作用以及它如何解决问题的问题。带有解释的答案通常更有帮助、质量更好,并且更有可能吸引投票
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2013-08-06
              • 2011-04-08
              • 2023-03-09
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多