Удалить пустые строки из массива при сохранении записи без цикла?

90

Этот вопрос был задан здесь: удалить пустые строки из массива, сохраняя запись индексов с непустыми строками

Если вы заметили, что @Baz выложил это;

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

"и из этого я хочу создать следующие два массива:"

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

Все ответы на этот вопрос относятся к форме зацикливания.

Мой вопрос: есть ли возможность удалить все indexes empty string без зацикливания? ... есть ли другая альтернатива, кроме итерации массива?

Может быть, некоторые из regexних jQueryмы не знаем?

Мы высоко ценим все ответы или предложения.

Универсальный захват
источник

Ответы:

325
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
@DiegoPlentz, у людей, которые все еще используют IE8, будет гораздо больше проблем, чем просто удаление пробелов в массиве ... Я почти никогда не задумывался о поддержке этого браузера в наши дни
Исаак
Это ближе всего к тому, array.filter(!!)что мы можем получить в настоящее время :)
james_womack
2
Вся благодарность за этот ответ должна быть отправлена
Исаак
Некоторое объяснение Booleanбыло бы неплохо.
robsch
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;
  };
}
ErickBest
источник
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];

sansid1983
источник
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(" ")«замените все пробелы ничем, затем попробуйте разделить каждое пробел»
Исаак
0

Вы можете использовать метод lodash, он работает для строки, числа и логического типа

_.compact([0, 1, false, 2, '', 3]);
// => [1, 2, 3]

https://lodash.com/docs/4.17.15#compact

Есин ОНЕР
источник