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.

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


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!==''});

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

3
arr = arr.filter(v => v);

sebagai vbalasannya implikasi diubah menjadi kebenaran


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


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

.replace(" ","").split(" ")"ganti semua spasi dengan tidak ada apa pun, lalu coba pisahkan di setiap ruang"
Isaac

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.