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.

Uniwersalny uchwyt
źródło

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

Izaak
źródło
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!==''});
haithamahmed
źródło
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;
  };
}
ErickBest
źródło
3
arr = arr.filter(v => v);

zwrócony vjest implicity przekształca się truthy

haind
źródło
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];

sansid1983
źródło
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);
Atif Hussain
źródło
.replace(" ","").split(" ")„zamień wszystkie spacje na nic, a następnie spróbuj podzielić na każdą spację”
Isaac,