我发现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"]
是否有一种很好的方法可以将此方法扩展为删除空格,还是应该通过首先迭代数组来修剪空格?
答案 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;
...和ES2015(ES6)的(如果您的浏览器还不支持箭头功能,那么它将不起作用):
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;
答案 1 :(得分:6)
您可以利用空字符串作为虚假值。
您可以将Array#filter
与String#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)
\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)