Döngü Olmadan kayıt tutulurken diziden boş dizeler kaldırılsın mı?


90

Bu soru burada soruldu: Boş olmayan dizelerle dizinlerin kaydını tutarken diziden boş dizeleri kaldırın

Verileni @Baz'ın düzenlediğini fark ederseniz;

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

"ve bundan şu iki diziyi üretmek istiyorum:"

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

Bu soruya verilen tüm cevaplar bir döngü biçimine gönderme yapıyordu.

Sorum: Bir olasılık var mı kaldırmak tüm indexile es empty string herhangi döngü olmadan? ... diziyi yinelemekten başka alternatif var mı?

Farkında olmadığımız bazıları regexveya bazıları jQueryolabilir mi?

Tüm cevaplar veya öneriler çok takdir edilmektedir.

Yanıtlar:


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 dokümantasyon


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

Ok fonksiyonları belgeleri


3
Tam olarak nasıl hissettiğini biliyorum, bunu aylar önce kullandım, pek çok küçük sorunu
Isaac

14
@DiegoPlentz hala IE8 çalıştıran insanlar bir dizideki boşlukları kaldırmaktan çok daha fazla sorun yaşayacaklar ... Bu günlerde bu tarayıcıyı desteklemeyi neredeyse hiç düşünmüyorum
Isaac

Bu, array.filter(!!)şu anda alabildiğimiz en yakın olanı :)
james_womack

2
Bu cevaba ilişkin tüm krediler stackoverflow.com/questions/16701319/…
Isaac

Bununla ilgili bazı açıklamalar Booleangüzel olurdu.
robsch

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

Kolayca en iyi cevap. Tam olarak sorunun ne istediğini yapıyor. Sıfır değerleri kaldırmaz.
Bryan

9

LÜTFEN DİKKAT: Dokümantasyon şunları söylüyor:

filterECMA-262 standardının bir JavaScript uzantısıdır; bu nedenle, standardın diğer uygulamalarında mevcut olmayabilir . Betiklerinizin başına aşağıdaki kodu ekleyerek, bunu yerel olarak desteklemeyen ECMA-262 uygulamalarında filtre kullanımına izin vererek bu sorunu çözebilirsiniz. Bu algoritma, fn.call'ın Function.prototype.call'ın orijinal değeri olarak değerlendirdiği ve Array.prototype.push'un orijinal değerine sahip olduğu varsayılarak, ECMA-262, 5. sürümde tam olarak belirtilen algoritmadır.

Bu nedenle, bazı sıkıntılardan kaçınmak için , başlangıçta bu kodu betiğinize eklemeniz gerekebilir .

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

döndürüldüğü gibi v, ima gerçeğe dönüştürülür


2

JQuery kullanıyorsanız, grep yararlı olabilir:


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

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

arr şimdi [ a, b, c, d, e, f, g];


2
jquery, basit bir görev için çok fazla yer kaplıyor gibi görünüyor
Isaac

0

yani, aşağıdaki gibi virgül, boşluk veya satırsonu ile ayrılmış birden çok e-posta adresi almamız gerekir.

    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(" ")"tüm boşlukları hiçbir şeyle değiştirin, sonra her boşlukta bölmeyi deneyin"
Isaac

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.