Видалити порожні рядки з масиву, зберігаючи запис без циклу?


90

Тут було задано таке питання: Видаліть порожні рядки з масиву, зберігаючи записи індексів з не пустими рядками

Якби ви помітили дане, як @Baz виклав це;

"I", "am", "", "still", "here", "", "man"

"і з цього я хочу створити наступні два масиви:"

"I", "am", "still", "here", "man"

Усі відповіді на це питання стосувались форми циклічного циклу.

Моє запитання: Чи є можливість видалити всі indexES empty string без жодного циклу? ... чи існує якась інша альтернатива, крім ітерації масиву?

Можливо, про деякі regexчи деякі jQueryми не знаємо?

Всі відповіді чи пропозиції високо вдячні.

Відповіді:


323
var arr = ["I", "am", "", "still", "here", "", "man"]
// arr = ["I", "am", "", "still", "here", "", "man"]
arr = arr.filter(Boolean)
// arr = ["I", "am", "still", "here", "man"]

filter документація


// arr = ["I", "am", "", "still", "here", "", "man"]
arr = arr.filter(v=>v!='');
// arr = ["I", "am", "still", "here", "man"]

Документація щодо функцій стрілки


3
Я точно знаю, як ти почуваєшся, я використав це кілька місяців тому, виправляє стільки дрібних проблем
Ісаак

14
Люди, які все ще використовують IE8, мають набагато більше проблем, ніж просто видалення пробілів у масиві ... Я майже не розглядаю можливості підтримки цього браузера в наші дні
Ісаак

Це найближче до того, array.filter(!!)що ми можемо отримати зараз:
james_womack

2
Вся заслуга за цю відповідь повинна надходити на stackoverflow.com/questions/16701319/…
Ісаак

Деякі пояснення щодо цього Booleanбуло б непогано.
Робш

18
var newArray = oldArray.filter(function(v){return v!==''});

Легко найкраща відповідь. Робить саме те, що задає питання. Не видаляє нульові значення.
Bryan

9

Зверніть увагу: Документація говорить:

filterє розширенням JavaScript до стандарту ECMA-262; як такий він може не бути присутнім в інших реалізаціях стандарту . Ви можете обійти це, вставивши на початку своїх сценаріїв наступний код, дозволяючи використовувати фільтр у реалізаціях ECMA-262, які його не підтримують. Цей алгоритм є точно таким, як зазначено у ECMA-262, 5-е видання, припускаючи, що fn.call обчислює вихідне значення Function.prototype.call, а Array.prototype.push має своє початкове значення.

Отже, щоб уникнути болю в серці, можливо, доведеться додати цей код до свого сценарію на початку .

if (!Array.prototype.filter) {
  Array.prototype.filter = function (fn, context) {
    var i,
        value,
        result = [],
        length;
        if (!this || typeof fn !== 'function' || (fn instanceof RegExp)) {
          throw new TypeError();
        }
        length = this.length;
        for (i = 0; i < length; i++) {
          if (this.hasOwnProperty(i)) {
            value = this[i];
            if (fn.call(context, value, i, this)) {
              result.push(value);
            }
          }
        }
    return result;
  };
}

3
arr = arr.filter(v => v);

як повертається vімпліцит, перетворений на істинний


2

Якщо ви використовуєте jQuery, grep може бути корисним:


var arr = [ a, b, c, , e, f, , g, h ];

arr = jQuery.grep(arr, function(n){ return (n); });

arr зараз [ a, b, c, d, e, f, g];


2
jquery здається великою громіздкістю для службового завдання
Ісаак

0

тобто нам потрібно взяти кілька адрес електронної пошти, розділених комами, пробілами або новим рядком, як показано нижче.

    var emails = EmailText.replace(","," ").replace("\n"," ").replace(" ","").split(" ");
    for(var i in emails)
        emails[i] = emails[i].replace(/(\r\n|\n|\r)/gm,"");

    emails.filter(Boolean);
    console.log(emails);

.replace(" ","").split(" ")"замінити всі пробіли нічим, а потім спробуйте розділити кожен пробіл"
Ісаак

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.