简体   繁体   English

用空格分割字符串,没有空元素?

[英]Splitting string by whitespace, without empty elements?

I am trying to explode an string using javascript to pick searchterms, whitespace-separated.我正在尝试使用 javascript 来分解字符串以选择以空格分隔的搜索词。 However I get empty array elements if a searchterm is ended by a whitespace, as shown below.但是,如果搜索项以空格结尾,我会得到空数组元素,如下所示。

What should I do instead to avoid post-processing this array and removing empty elements?我应该怎么做才能避免对该数组进行后处理并删除空元素?

var str = "searchterm1 searchterm2";
console.log(str.split(" ")); // ["searchterm1", "searchterm2"]

var strb = "searchterm1 "; // Note the ending whitespace
console.log(strb.split(" ")); // ["searchterm1", ""]

您可以简单地匹配所有非空格字符序列:

str.match(/[^ ]+/g)

No matter what splitter this always works:无论使用什么分离器,这总是有效的:

str.split(' ').filter(function(i){return i})
// With ES6
str.split(' ').filter(i => i)

Filter logic also can change in some other cases.过滤器逻辑在其他一些情况下也可以改变。

This is a bit old, but for documentation purposes there is also another neat way.这有点旧,但出于文档目的,还有另一种简洁的方法。

someString.filter(Boolean);

// Example
['fds', '', 'aaaaa', 'AA', 'ffDs', "", 'd'].filter(Boolean);
// Output
["fds", "aaaaa", "AA", "ffDs", "d"]

Edit编辑

How does it work ?它是如何工作的 ?

The following are identical以下是相同的

.filter(Boolean)
.filter((value) => Boolean(value))

Boolean() as function behave as a converter of any type to Boolean by the standard input to output. Boolean() as 函数表现为任何类型的转换器,通过标准输入到输出的布尔值。

References:参考:
Global Objects -> Boolean 全局对象 -> 布尔值
Truthy真实的
Falsy假的

If you want a function that you can use, just extend String:如果您想要一个可以使用的函数,只需扩展 String:

 String.prototype.splitNoSpaces = function(){
     return this.split(' ').filter(function(i){return i});
 };

 //Now use it!
 var classString = "class1    class2 class3    class4";
 var classArray = classString.splitNoSpaces();

 //classArray[0] is class1
 //classArray[1] is class2
 //classArray[2] is class3
 //classArray[3] is class4

Thanks to @user1079877 for the hint感谢@user1079877 的提示

This is the simplest solution IMO.这是 IMO 最简单的解决方案。 trim() first to get rid of leading/trailing whitespace, then split by whitespace. trim()首先去掉前导/尾随空格,然后按空格分割。

 function split(str) { return str.trim().split(/\s+/); } console.log(split('foo bar baz')); console.log(split(' foo bar baz '));

Add function:添加功能:

//Some browsers support trim so we check for that first
if(!String.prototype.trim) {  
  String.prototype.trim = function () {  
    return this.replace(/^\s+|\s+$/g,'');  
  };  
}

Then call trim on the string:然后在字符串上调用 trim :

var strb = "searchterm1 "; // Note the ending whitespace
console.log(strb.trim().split(" ")); // ["searchterm1"]

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM