Удалите пустые или пробельные строки из массива - 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)