Hapus string kosong dari array sambil menyimpan catatan Tanpa Loop?

90

Pertanyaan ini ditanyakan di sini: Hapus string kosong dari array sambil menyimpan catatan indeks dengan string yang tidak kosong

Jika Anda melihat yang diberikan sebagai @Baz meletakkannya;

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

"dan dari sini saya ingin menghasilkan dua larik berikut:"

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

Semua Jawaban atas pertanyaan ini mengacu pada bentuk perulangan.

Pertanyaan saya: Apakah ada kemungkinan untuk menghapus semua indexes dengan empty string tanpa perulangan? ... apakah ada alternatif lain selain dari iterasi array?

Mungkin beberapa regexatau beberapa jQueryyang tidak kita sadari?

Semua jawaban atau saran sangat dihargai.

Pegang Universal
sumber

Jawaban:

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 dokumentasi


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

Dokumentasi fungsi panah

Isaac
sumber
3
Saya tahu persis bagaimana perasaan Anda, saya menggunakannya berbulan-bulan yang lalu, memperbaiki begitu banyak masalah kecil
Isaac
14
@DiegoPlentz orang yang masih menjalankan IE8 akan memiliki lebih banyak masalah daripada hanya menghapus kosong dalam array ... Saya hampir tidak pernah mempertimbangkan untuk mendukung browser itu hari ini
Isaac
Ini adalah yang terdekat dengan array.filter(!!)yang saat ini kami dapatkan :)
james_womack
2
Semua kredit untuk jawaban ini harus masuk ke stackoverflow.com/questions/16701319/…
Isaac
Beberapa penjelasan tentang Booleanakan menyenangkan.
robsch
18
var newArray = oldArray.filter(function(v){return v!==''});
haithamahmed
sumber
Jawaban terbaik dengan mudah. Melakukan apa yang ditanyakan oleh pertanyaan itu. Tidak menghapus nilai nol.
Bryan
9

HARAP DICATAT: Dokumentasi mengatakan:

filteradalah ekstensi JavaScript untuk standar ECMA-262; karena itu mungkin tidak ada dalam implementasi standar lainnya . Anda dapat mengatasinya dengan menyisipkan kode berikut di awal skrip Anda, mengizinkan penggunaan filter dalam implementasi ECMA-262 yang tidak mendukungnya secara native. Algoritme ini persis seperti yang ditentukan dalam ECMA-262, edisi ke-5, dengan asumsi bahwa fn.call mengevaluasi ke nilai asli dari Function.prototype.call, dan Array.prototype.push memiliki nilai aslinya.

Jadi, untuk menghindari sakit hati, Anda mungkin harus menambahkan kode ini ke skrip Anda di awal .

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
sumber
3
arr = arr.filter(v => v);

sebagai vbalasannya implikasi diubah menjadi kebenaran

haind
sumber
2

Jika menggunakan jQuery, grep mungkin berguna:


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

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

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

sansid1983
sumber
2
jquery sepertinya sangat besar untuk tugas kasar
Isaac
0

yaitu kita perlu mengambil beberapa alamat email yang dipisahkan dengan koma, spasi atau baris baru seperti di bawah ini.

    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
sumber
.replace(" ","").split(" ")"ganti semua spasi dengan tidak ada apa pun, lalu coba pisahkan di setiap ruang"
Isaac