Удалите пустые или пробельные строки из массива - Javascript
Я нашел этот красивый метод для удаления пустых строк - arr = arr.filter(Boolean)
.
Но он, похоже, не работает над простыми строками.
var arr = ['Apple', ' ', 'Mango', '', 'Banana', ' ', 'Strawberry'];
arr = arr.filter(Boolean);
// ["Apple", " ", "Mango", "Banana", " ", "Strawberry"]
// should be ["Apple", "Mango", "Banana", "Strawberry"]
Есть ли хороший способ расширить этот метод до удаления пробелов, или я должен обрезать пробелы, итерации массива в первую очередь?
Ответы
Ответ 1
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>
Ответ 2
Вы можете использовать пустую строку как ложное значение.
Вы можете использовать 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>
Ответ 3
На основе эта ссылка MDN:
\s
Совпадает с одним символом пробела, включая пробел, вкладку, подачу формы, линию и другие пространства Юникода. Эквивалентно [ \f\n\r\t\v\u00a0\u1680\u180e\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]
.
И на ссылка ECMA 262, говоря \s
должна соответствовать "White Space" , например \u0009
(Tab, <TAB>
), \u000B
(Вертикальная вкладка, <VT>
), \u000C
(Подача формы, <FF>
), \u0020
(Пробел, <SP>
), \u00A0
(пробел без пробела, <NBSP>
), \uFEFF
(знак байтового заказа, <BOM>
) и другая категория "Zs" (<USP>
), а также "терминаторы строк" , такие как \u000A
(Line Feed, <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);
Ответ 4
Вы можете попробовать этот подход. Я нашел этот процесс простым, и он работает для меня.
let arrayEle = ["abc", " "," ", "def", "xyz", " "];
arrayEle = arrayEle.filter((element) => {
return /\S/.test(element);
});
console.log(arrayEle);
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.7.5/angular.min.js"></script>
Ответ 5
Можно использовать 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)