Usunąć puste ciągi z tablicy, zachowując zapis bez pętli?


90

To pytanie zostało tutaj zadane: Usuń puste ciągi z tablicy, zachowując zapis indeksów z niepustymi ciągami

Jeśli zauważysz dane, jak to ułożył @Baz;

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

"i na tej podstawie chciałbym utworzyć następujące dwie tablice:"

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

Wszystkie odpowiedzi na to pytanie dotyczyły formy zapętlenia.

Moje pytanie: czy istnieje możliwość usunięcia wszystkich indexznaków empty string bez zapętlenia? ... czy istnieje inna alternatywa poza iteracją tablicy?

Mogą być pewne regexlub niektórych jQuery, że nie jesteśmy świadomi?

Wszystkie odpowiedzi lub sugestie są wysoko cenione.

Odpowiedzi:


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

filter dokumentacja


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

Dokumentacja funkcji strzałek


3
Wiem dokładnie, jak się czujesz, użyłem go kilka miesięcy temu, rozwiązuje tak wiele małych problemów
Izaak

14
@DiegoPlentz ludzie, którzy nadal używają IE8, będą mieli o wiele więcej problemów niż tylko usuwanie spacji z tablicy ... W dzisiejszych czasach prawie nigdy nie rozważam obsługi tej przeglądarki
Isaac

To jest najbliżej array.filter(!!)tego, jakie obecnie możemy uzyskać :)
james_womack

2
Wszystkie zasługi za tę odpowiedź powinny znaleźć się na stackoverflow.com/questions/16701319/…
Isaac,

Pewne wyjaśnienie Booleanbyłoby miłe.
robsch

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

Z łatwością najlepsza odpowiedź. Robi dokładnie to, o co chodzi w pytaniu. Nie usuwa wartości zerowych.
Bryan

9

UWAGA: Dokumentacja mówi:

filterjest rozszerzeniem JavaScript do standardu ECMA-262; jako taki może nie występować w innych implementacjach standardu . Możesz obejść ten problem, wstawiając następujący kod na początku swoich skryptów, umożliwiając użycie filtru w implementacjach ECMA-262, które go natywnie nie obsługują. Ten algorytm jest dokładnie tym, który określono w ECMA-262, 5. edycja, przy założeniu, że fn.call zwraca oryginalną wartość Function.prototype.call i że Array.prototype.push ma swoją oryginalną wartość.

Tak więc, aby uniknąć bólu serca, być może będziesz musiał dodać ten kod do swojego skryptu na początku .

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

zwrócony vjest implicity przekształca się truthy


2

Jeśli używasz jQuery, grep może się przydać:


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

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

arr jest teraz [ a, b, c, d, e, f, g];


2
jQuery wydaje się być ogromnym obciążeniem dla zwykłego zadania
Izaak

0

tj. musimy wziąć wiele adresów e-mail oddzielonych przecinkiem, spacjami lub znakiem nowej linii, jak poniżej.

    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(" ")„zamień wszystkie spacje na nic, a następnie spróbuj podzielić na każdą spację”
Isaac,

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.