Pertanyaan Bagaimana cara mengosongkan larik di JavaScript?


Apakah ada cara untuk mengosongkan array dan jika demikian mungkin dengan .remove()?

Contohnya,

A = [1,2,3,4];

Bagaimana saya bisa mengosongkan itu?


2199
2017-08-05 09:08


asal


Jawaban:


Cara menghapus larik yang ada A:

Metode 1

(ini jawaban asli saya untuk pertanyaan)

A = [];

Kode ini akan mengatur variabel A ke larik kosong baru. Ini sempurna jika Anda tidak punya referensi ke array asli A di tempat lain karena ini benar-benar menciptakan array baru (kosong). Anda harus berhati-hati dengan metode ini karena jika Anda telah mereferensikan array ini dari variabel atau properti lain, array asli akan tetap tidak berubah. Hanya gunakan ini jika Anda hanya mereferensikan larik berdasarkan variabel aslinya A.

Ini juga solusi tercepat.

Contoh kode ini menunjukkan masalah yang dapat Anda hadapi saat menggunakan metode ini:

var arr1 = ['a','b','c','d','e','f'];
var arr2 = arr1;  // Reference arr1 by another variable 
arr1 = [];
console.log(arr2); // Output ['a','b','c','d','e','f']

Metode 2 (sebagai disarankan oleh Matthew Crumley)

A.length = 0

Ini akan menghapus array yang ada dengan mengatur panjangnya menjadi 0. Beberapa berpendapat bahwa ini mungkin tidak berfungsi di semua implementasi JavaScript, tetapi ternyata ini tidak terjadi. Ia juga bekerja ketika menggunakan "mode ketat" di ECMAScript 5 karena properti panjang dari array adalah properti baca / tulis.

Metode 3 (sebagai disarankan oleh Anthony)

A.splice(0,A.length)

Menggunakan .splice() akan bekerja dengan sempurna, tetapi sejak itu .splice() fungsi akan mengembalikan array dengan semua item yang dihapus, itu benar-benar akan mengembalikan salinan dari array asli. Benchmark menunjukkan bahwa ini tidak berpengaruh pada kinerja apa pun.

Metode 4 (sebagai disarankan oleh tanguy_k)

while(A.length > 0) {
    A.pop();
}

Solusi ini tidak terlalu ringkas, dan juga merupakan solusi paling lambat, bertentangan dengan tolok ukur sebelumnya yang dirujuk dalam jawaban asli.

Kinerja

Dari semua metode membersihkan suatu larik yang ada, metode 2 dan 3 sangat mirip dalam kinerjanya dan jauh lebih cepat daripada metode 4. Lihat ini patokan.

Seperti yang ditunjukkan oleh Diadistis di dalam mereka menjawab di bawah ini, tolok ukur asli yang digunakan untuk menentukan kinerja dari empat metode yang dijelaskan di atas adalah cacat. Patokan asli menggunakan kembali array yang dihapus sehingga iterasi kedua membersihkan array yang sudah kosong.

Patokan berikut memperbaiki cacat ini: http://jsben.ch/#/hyj65. Ini jelas menunjukkan bahwa metode # 2 (properti panjang) dan # 3 (sambatan) adalah yang tercepat (tidak termasuk metode # 1 yang tidak mengubah array asli).


Ini telah menjadi topik hangat dan penyebab banyak kontroversi. Sebenarnya ada banyak jawaban yang benar dan karena jawaban ini telah ditandai sebagai jawaban yang diterima untuk waktu yang sangat lama, saya akan menyertakan semua metode di sini. Jika Anda memilih jawaban ini, tolong berikan jawaban lain yang juga saya rujukan.


3440
2017-08-05 09:10



Jika Anda perlu mempertahankan array asli karena Anda memiliki referensi lain untuk itu yang harus diperbarui juga, Anda dapat menghapusnya tanpa membuat array baru dengan mengatur panjangnya ke nol:

A.length = 0;

2253
2017-08-05 16:29



Di sini implementasi kerja tercepat sementara menjaga susunan yang sama ("yg mungkin berubah"):

Array.prototype.clear = function() {
  while (this.length) {
    this.pop();
  }
};

FYI Peta mendefinisikan clear() jadi sepertinya masuk akal untuk memilikinya clear() untuk Array terlalu.

Atau sebagai Underscore.js mixin:

_.mixin({
  clearArray: function(array) {
    while (array.length) {
      array.pop();
    }
  }
});

Atau fungsi sederhana:

function clearArray(array) {
  while (array.length) {
    array.pop();
  }
}

TypeScript versi:

function clearArray<T>(array: T[]) {
  while (array.length) {
    array.pop();
  }
}

Untuk itu tidak bisa disederhanakan while (array.pop()): tes akan gagal.

Dan tes yang menyertainya:

describe('Array', () => {
  it('should clear the array', () => {
    let array = [1, 2, 3, 4, 5];
    array.clear();
    expect(array.length).toEqual(0);
    expect(array[0]).toEqual(undefined);
    expect(array[4]).toEqual(undefined);

    // Even with undefined or null inside
    array = [1, undefined, 3, null, 5];
    array.clear();
    expect(array.length).toEqual(0);
    expect(array[0]).toEqual(undefined);
    expect(array[4]).toEqual(undefined);
  });
});

Di sini jsPerf yang diperbarui: http://jsperf.com/array-destroy/32  http://jsperf.com/array-destroy/152


255
2018-06-25 20:32



Lebih ramah lintas browser dan solusi yang lebih optimal adalah menggunakan splice metode untuk mengosongkan konten dari array A seperti di bawah ini:

A.splice(0, A.length);


182
2017-11-15 09:49



Jawaban yang memiliki tidak kurang dari 2739 upvotes sekarang adalah menyesatkan dan salah.

Pertanyaannya adalah: "Bagaimana Anda mengosongkan larik yang ada?" Misalnya. untuk A = [1,2,3,4].

  1. Mengatakan "A = [] adalah jawabannya "tidak tahu dan benar-benar salah. [] == [] aku s Salah.

    Ini karena kedua array ini adalah dua objek individual yang terpisah, dengan dua identitas mereka sendiri, mengambil ruang mereka sendiri di dunia digital, masing-masing dengan sendirinya.


Katakanlah ibumu memintamu untuk mengosongkan tempat sampah.

  • Anda tidak membawa yang baru seolah-olah Anda telah melakukan apa yang diminta.
  • Sebaliknya, Anda mengosongkan tempat sampah.
  • Anda tidak mengganti yang diisi dengan kaleng kosong baru, dan Anda tidak mengambil label "A" dari kaleng yang terisi dan menempelkannya ke yang baru seperti A = [1,2,3,4]; A = [];

Mengosongkan objek array adalah hal termudah yang pernah ada:

A.length = 0;

Dengan cara ini, kaleng di bawah "A" tidak hanya kosong, tetapi juga bersih seperti baru!


  1. Selanjutnya, Anda tidak perlu membuang sampah dengan tangan sampai kaleng itu kosong! Anda diminta untuk mengosongkan yang sudah ada, sepenuhnya, dalam satu giliran, untuk tidak mengambil sampah sampai kalengnya kosong, seperti di:

    while(A.length > 0) {
        A.pop();
    }
    
  2. Atau, letakkan tangan kiri Anda di bawah sampah, pegang dengan hak Anda di bagian atas untuk dapat menarik isinya seperti:

    A.splice(0, A.length);
    

Tidak, Anda diminta untuk mengosongkannya:

A.length = 0;

Ini adalah satu-satunya kode yang secara benar mengosongkan konten dari susunan JavaScript yang diberikan.


61
2018-04-30 15:18



Uji kinerja:

http://jsperf.com/array-clear-methods/3

a = []; // 37% slower
a.length = 0; // 89% slower
a.splice(0, a.length)  // 97% slower
while (a.length > 0) {
    a.pop();
} // Fastest

59
2018-05-14 07:14



Anda dapat menambahkan ini ke file JavaScript Anda untuk memungkinkan array Anda menjadi "dibersihkan":

Array.prototype.clear = function() {
    this.splice(0, this.length);
};

Maka Anda dapat menggunakannya seperti ini:

var list = [1, 2, 3];
list.clear();

Atau jika Anda ingin memastikan Anda tidak menghancurkan sesuatu:

if (!Array.prototype.clear) {
    Array.prototype.clear = function() {
       this.splice(0, this.length);
    };
}

Banyak orang berpikir Anda seharusnya tidak memodifikasi objek asli (seperti Array), dan saya cenderung setuju. Harap berhati-hati dalam memutuskan cara menangani ini.


32
2017-12-11 02:58



Array.prototype.clear = function() {
    this.length = 0;
};

Dan sebut saja: array.clear();


16
2018-02-22 21:28