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


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;
  };
}


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.