从数组中删除空或空格字符串 - Javascript

时间:2016-02-18 09:03:07

标签: javascript arrays regex string filter

我发现this美丽的方法可以删除空字符串 - arr = arr.filter(Boolean)

但它似乎不适用于空白字符串。

var arr = ['Apple', '  ', 'Mango', '', 'Banana', ' ', 'Strawberry'];
arr = arr.filter(Boolean);
// ["Apple", "  ", "Mango", "Banana", " ", "Strawberry"]

// should be ["Apple", "Mango", "Banana", "Strawberry"]

是否有一种很好的方法可以将此方法扩展为删除空格,还是应该通过首先迭代数组来修剪空格?

9 个答案:

答案 0 :(得分:29)

filter有效,但您需要正确的谓词函数,Boolean不是(为此目的):

// Example 1 - Using String#trim (added in ES2015, needs polyfilling in outdated
// environments like IE)
arr = arr.filter(function(entry) { return entry.trim() != ''; });

// Example 2 - Using a regular expression instead of String#trim
arr = arr.filter(function(entry) { return /\S/.test(entry); });

\S表示"非空白字符,"所以/\S/.test(...)检查字符串是否包含至少一个非空白字符。)

或(可能有点过分,难以阅读)

// Example 3
var rex = /\S/;
arr = arr.filter(rex.test.bind(rex));

使用ES2015(又名ES6)箭头功能,更简洁:

// Example 4
arr = arr.filter(entry => entry.trim() != '');

// Example 5
arr = arr.filter(entry => /\S/.test(entry));

实例 - ES5及更早的版本:



var arr = ['Apple', '  ', 'Mango', '', 'Banana', ' ', 'Strawberry'];
snippet.log("Example 1: " + JSON.stringify(arr.filter(function(entry) { return entry.trim() != ''; })));
snippet.log("Example 2: " + JSON.stringify(arr.filter(function(entry) { return /\S/.test(entry); })));
var rex = /\S/;
snippet.log("Example 3: " + JSON.stringify(arr.filter(rex.test.bind(rex))));

<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="//tjcrowder.github.io/simple-snippets-console/snippet.js"></script>
&#13;
&#13;
&#13;

...和ES2015(ES6)的(如果您的浏览器还不支持箭头功能,那么它将不起作用)

&#13;
&#13;
var arr = ['Apple', '  ', 'Mango', '', 'Banana', ' ', 'Strawberry'];
snippet.log("Example 4: " + JSON.stringify(arr.filter(entry => !entry.trim() == '')));
snippet.log("Example 5: " + JSON.stringify(arr.filter(entry => /\S/.test(entry))));
&#13;
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="//tjcrowder.github.io/simple-snippets-console/snippet.js"></script>
&#13;
&#13;
&#13;

答案 1 :(得分:6)

您可以利用空字符串作为虚假值。

您可以将Array#filterString#trim一起使用。

使用ES6箭头功能:

arr = arr.filter(e => String(e).trim());

var arr = ['Apple', '  ', 'Mango', '', 'Banana', ' ', 'Strawberry'];
var nonEmpty = arr.filter(e => String(e).trim());

document.getElementById('result').innerHTML = JSON.stringify(nonEmpty, 0, 4);
<pre id="result"></pre>

使用ES5匿名函数:

arr = arr.filter(function(e) {
    return String(e).trim();
});

var arr = ['Apple', '  ', 'Mango', '', 'Banana', ' ', 'Strawberry'];
var nonEmpty = arr.filter(function(e) {
    return String(e).trim();
});

document.getElementById('result').innerHTML = JSON.stringify(nonEmpty, 0, 4);
<pre id="result"></pre>

答案 2 :(得分:3)

基于this MDN reference

  

\s
  匹配单个空格字符,包括空格,制表符,换页符,换行符和其他Unicode空格。相当于[ \f\n\r\t\v​\u00a0\u1680​\u180e\u2000​-\u200a​\u2028\u2029\u202f\u205f​\u3000\ufeff]

ECMA 262 reference上,\s应与\u0009匹配,如<TAB>(Tab,\u000B),<VT>(垂直标签,{ {1}}),\u000C(换页,<FF>),\u0020(空格,<SP>),\u00A0(不间断空格,{{ 1}}),<NBSP>(字节顺序标记,\uFEFF)和其他类别“Zs”(<BOM>)以及"White Space"类似<USP>(换行,\u000A),<LF>(回车,\u000D),<CR>(行分隔符,\u2028)和<LS>(段落分隔符) ,\u2029),只有当<PS>本身不可用时,您才可以使用以下代码删除空白或空白的元素:

trim()

如果某些旧浏览器与var arr = ['Apple', ' ', 'Mango', '', 'Banana', ' ', 'Strawberry']; arr = arr.filter(s => s.replace(/\s+/g, '').length !== 0); // Or for ES5 // arr = arr.filter(function (el) { return el.replace(/\s+/g, '').length !== 0; }); console.log(arr);的行为不同,请将其替换为\s字符类:

[ \f\n\r\t\v​\u00a0\u1680​\u180e\u2000​-\u200a​\u2028\u2029\u202f\u205f​\u3000\ufeff]

您还可以进一步自定义它以包含新的Unicode空间。

答案 3 :(得分:0)

您可以尝试此approach。我发现此过程很简单,并且对我有用。

....
fragmentTransaction.replace(R.id.contentFrame, fragment);
fragmentTransaction.runOnCommit(new Runnable() // be carefull on this call. check documentation!!
{
    @Override
    public void run()
    {
        ... do something...  // this will  run after fragment's on resume. you can check.
    }
});
fragmentTransaction.commit();
let arrayEle = ["abc", " "," ", "def", "xyz", " "]; 

  arrayEle = arrayEle.filter((element) => {
    return /\S/.test(element);
  });
  
  console.log(arrayEle);

答案 4 :(得分:0)

常量水果= ['Apple',undefined,'','Mango','','Banana','','Strawberry'];

fruits.filter(fruit => fruit && fruit.trim())

输出:[“苹果”,“芒果”,“香蕉”,“草莓”]

Filter condition: fruit && fruit.trim()

prefix - will remove all the falsy value
suffix - will trim and then remove all the falsy values

答案 5 :(得分:0)

用ES6编写的一线解决方案,可快速使用:

const filterArray=a=>a.filter(x=>typeof x!=='string'||!!x.trim())

此方法的一些优点是它会忽略不是字符串的任何内容。

没有ES6:

function filterArray(a) {
  return a.filter(function(x) {
    return typeof x !== 'string' || !!x.trim()
  })
}

示例:

const filterArray=a=>a.filter(x=>typeof x!=='string'||!!x.trim())

console.log(filterArray([1, 2, 4, '', '']))

或者如果您的浏览器不支持ES6(它可能支持):

function filterArray(a) {
  return a.filter(function(x) {
    return typeof x !== 'string' || !!x.trim()
  })
}

console.log(filterArray([1, 2, 4, '', '']))

答案 6 :(得分:0)

我使用过滤器并检查元素长度是否不等于零。 它对我有用,这种解决方案很简短:

const arr = ['Apple', '', 'Mango', '', 'Banana', '', 'Strawberry']

const arr2 = arr.filter(item => item.length !== 0)          

console.log(arr2)

答案 7 :(得分:0)

JOIN

答案 8 :(得分:-2)

可以使用Array.protype.join()String.prototype.split()参数RegExp /\s|,/后跟.filter(Boolean)

var arr = ['Apple', '  ', 'Mango', '', 'Banana', ' ', 'Strawberry'];
arr = arr.join().split(/\s|,/).filter(Boolean);
console.log(arr)