Temukan index
elemen array yang ingin Anda hapus menggunakan indexOf
, dan kemudian hapus indeks itu dengan splice
.
Metode splice () mengubah konten array dengan menghapus elemen yang ada dan / atau menambahkan elemen baru.
const array = [2, 5, 9];
console.log(array);
const index = array.indexOf(5);
if (index > -1) {
array.splice(index, 1);
}
// array = [2, 9]
console.log(array);
Parameter kedua splice
adalah jumlah elemen yang akan dihapus. Catatan yang splice
mengubah array di tempat dan mengembalikan array baru yang mengandung elemen yang telah dihapus.
Untuk alasan kelengkapan, berikut adalah fungsinya. Fungsi pertama menghapus hanya kejadian tunggal (yaitu menghapus pertandingan pertama 5
dari [2,5,9,1,5,8,5]
), sedangkan fungsi kedua menghapus semua kejadian:
function removeItemOnce(arr, value) {
var index = arr.indexOf(value);
if (index > -1) {
arr.splice(index, 1);
}
return arr;
}
function removeItemAll(arr, value) {
var i = 0;
while (i < arr.length) {
if(arr[i] === value) {
arr.splice(i, 1);
} else {
++i;
}
}
return arr;
}
array.indexOf(testValue)
pada array kosong akan menjadi -1, dan jika Anda menguji untuk itu maka tidak ada sambungan. Mungkin jawabannya sudah berubah sejak itu.Saya tidak tahu bagaimana Anda mengharapkan
array.remove(int)
untuk berperilaku. Ada tiga kemungkinan yang dapat saya pikirkan yang mungkin Anda inginkan.Untuk menghapus elemen array pada indeks
i
:Jika Anda ingin menghapus setiap elemen dengan nilai
number
dari array:Jika Anda hanya ingin membuat elemen di indeks
i
tidak ada lagi, tetapi Anda tidak ingin indeks elemen lain berubah:sumber
delete
bukan cara yang tepat untuk menghapus elemen dari array!array.hasOwnProperty(i)
kembalifalse
dan memiliki elemen di posisi itu kembaliundefined
. Tapi saya akui itu bukan hal yang sangat umum untuk dilakukan.delete
tidak akan memperbarui panjang array tidak benar-benar menghapus elemen, hanya menggantinya dengan nilai spesialundefined
.undefined
: ia menghilangkan indeks dan nilai dari array, yaitu setelahdelete array[0]
,"0" in array
akan mengembalikan false.delete
harus dipahami mengapa tidak berfungsi seperti yang mereka harapkan.Diedit pada 2016 Oktober
Dalam contoh kode ini saya menggunakan fungsi "array.filter (...)" untuk menghapus item yang tidak diinginkan dari array. Fungsi ini tidak mengubah array asli dan membuat yang baru. Jika browser Anda tidak mendukung fungsi ini (mis. Internet Explorer sebelum versi 9, atau Firefox sebelum versi 1.5), pertimbangkan untuk menggunakan filter polyfill dari Mozilla .
Menghapus item (ECMA-262 Edition 5 kode alias JavaScript gaya lama)
Menghapus item (kode ECMAScript 6)
PENTINGECMAScript 6 "() => {}" sintaks fungsi panah sama sekali tidak didukung di Internet Explorer, Chrome sebelum versi 45, Firefox sebelum versi 22, dan Safari sebelum versi 10. Untuk menggunakan sintaks ECMAScript 6 di browser lama, Anda dapat menggunakan BabelJS .
Menghapus banyak item (kode ECMAScript 7)
Keuntungan tambahan dari metode ini adalah Anda dapat menghapus banyak item
PENTING "array.includes (...)" fungsi sama sekali tidak didukung di Internet Explorer, Chrome sebelum versi 47, Firefox sebelum versi 43, Safari versi sebelum 9, dan versi Edge sebelum 14 jadi di sini adalah polyfill dari Mozilla .
Menghapus banyak item (di masa depan, mungkin)
Jika proposal "This-Binding Syntax" pernah diterima, Anda akan dapat melakukan ini:
Coba sendiri di BabelJS :)
Referensi
sumber
filter
harus jauh lebih lambat untuk array besar?filter
mungkin memiliki kinerja lebih lambat tetapi kode lebih aman dan lebih baik. Selain itu, Anda dapat memfilter menurut indeks dengan menentukan argumen kedua dalam lambda:arr.filter((x,i)=>i!==2)
Itu tergantung pada apakah Anda ingin menyimpan tempat kosong atau tidak.
Jika Anda ingin slot kosong, hapus tidak apa-apa:
Jika tidak, Anda harus menggunakan metode sambatan :
Dan jika Anda membutuhkan nilai item itu, Anda bisa menyimpan elemen array yang dikembalikan:
Jika Anda ingin melakukannya dalam urutan tertentu, Anda dapat menggunakan
array.pop()
yang terakhir atauarray.shift()
yang pertama (dan keduanya mengembalikan nilai item juga).Dan jika Anda tidak tahu indeks item tersebut, Anda dapat menggunakannya
array.indexOf(item)
untuk mendapatkannya (dalamif()
untuk mendapatkan satu item atau dalamwhile()
untuk mendapatkan semuanya).array.indexOf(item)
mengembalikan indeks atau -1 jika tidak ditemukan.sumber
delete
bukan cara yang tepat untuk menghapus elemen dari array !!array[index] = undefined;
. Menggunakandelete
akan menghancurkan optimasi.Seorang teman mengalami masalah di Internet Explorer 8 dan menunjukkan kepada saya apa yang dia lakukan. Saya mengatakan kepadanya bahwa itu salah, dan dia memberi tahu saya bahwa dia mendapatkan jawabannya di sini. Jawaban teratas saat ini tidak akan berfungsi di semua browser (misalnya Internet Explorer 8), dan itu hanya akan menghilangkan kemunculan item pertama.
Hapus SEMUA instance dari array
Itu loop melalui array mundur (karena indeks dan panjang akan berubah ketika item dihapus) dan menghapus item jika ditemukan. Ini bekerja di semua browser.
sumber
i = arr.length -1
ataui--
membuatnya sama dengan indeks max.arr.length
hanyalah nilai awal untuki
.i--
akan selalu truthy (dan mengurangi oleh 1 di setiap loop op) sampai sama0
(nilai falsy) dan loop kemudian akan berhenti.arr.filter(function (el) { return el !== item })
, menghindari keharusan untuk memutasikan array beberapa kali. Ini menghabiskan sedikit lebih banyak memori, tetapi beroperasi jauh lebih efisien, karena ada sedikit pekerjaan yang perlu dilakukan.Ada dua pendekatan utama:
sambatan () :
anArray.splice(index, 1);
hapus :
delete anArray[index];
Hati-hati saat Anda menggunakan delete untuk sebuah array. Ini bagus untuk menghapus atribut objek, tetapi tidak begitu bagus untuk array. Lebih baik digunakan
splice
untuk array.Ingatlah bahwa ketika Anda menggunakan
delete
array, Anda bisa mendapatkan hasil yang salahanArray.length
. Dengan kata lain,delete
akan menghapus elemen, tetapi itu tidak akan memperbarui nilai properti panjang.Anda juga bisa berharap memiliki lubang dalam angka indeks setelah menggunakan delete, mis. Anda bisa berakhir dengan memiliki indeks 1, 3, 4, 8, 9, dan 11 dan panjang seperti sebelumnya sebelum menggunakan delete. Dalam hal itu, semua diindeks
for
loop yang akan macet, karena indeks tidak lagi berurutan.Jika Anda terpaksa menggunakan
delete
untuk beberapa alasan, maka Anda harus menggunakanfor each
loop ketika Anda perlu untuk loop melalui array. Faktanya, selalu hindari menggunakanfor
loop yang diindeks , jika memungkinkan. Dengan begitu kode akan lebih kuat dan kurang rentan terhadap masalah dengan indeks.sumber
sumber
for in
pada array, Anda sudah memiliki masalah.for in
pada array, Anda sudah memiliki masalah yang lebih besar.Tidak perlu menggunakan
indexOf
atausplice
. Namun, berkinerja lebih baik jika Anda hanya ingin menghapus satu kemunculan elemen.Temukan dan pindahkan (pindah):
Gunakan
indexOf
dansplice
(indeks):Gunakan hanya
splice
(sambungan):Run-times pada nodejs untuk array dengan 1000 elemen (rata-rata lebih dari 10000 run):
indexof sekitar 10x lebih lambat daripada bergerak . Bahkan jika ditingkatkan dengan menghapus panggilan ke
indexOf
dalam sambungan itu melakukan jauh lebih buruk daripada bergerak .sumber
Ini memberikan predikat alih-alih nilai.
CATATAN: itu akan memperbarui array yang diberikan, dan mengembalikan baris yang terpengaruh.
Pemakaian
Definisi
sumber
Anda dapat melakukannya dengan mudah dengan metode filter :
Ini menghapus semua elemen dari array dan juga bekerja lebih cepat dari kombinasi
slice
danindexOf
.sumber
John Resig memposting implementasi yang baik :
Jika Anda tidak ingin memperluas objek global, Anda dapat melakukan sesuatu seperti berikut ini, sebagai gantinya:
Tetapi alasan utama saya memposting ini adalah untuk memperingatkan pengguna terhadap implementasi alternatif yang disarankan dalam komentar di halaman itu (14 Des 2007):
Tampaknya bekerja dengan baik pada awalnya, tetapi melalui proses yang menyakitkan saya menemukan itu gagal ketika mencoba untuk menghapus elemen kedua hingga terakhir dalam sebuah array. Misalnya, jika Anda memiliki array 10-elemen dan Anda mencoba menghapus elemen ke-9 dengan ini:
Anda berakhir dengan array 8-elemen. Tidak tahu mengapa, tetapi saya mengkonfirmasi implementasi asli John tidak memiliki masalah ini.
sumber
Object.prototype.hasOwnProperty
selalu ¬¬Underscore.js dapat digunakan untuk menyelesaikan masalah dengan banyak browser. Ini menggunakan metode browser built-in jika ada. Jika mereka tidak ada seperti dalam kasus versi Internet Explorer yang lebih lama itu menggunakan metode kustom sendiri.
Contoh sederhana untuk menghapus elemen dari array (dari situs web):
sumber
Anda dapat menggunakan ES6. Misalnya untuk menghapus nilai '3' dalam kasus ini:
Keluaran:
sumber
Jika Anda ingin array baru dengan posisi yang dihapus dihapus, Anda selalu dapat menghapus elemen tertentu dan menyaring array. Mungkin perlu ekstensi objek array untuk browser yang tidak menerapkan metode filter, tetapi dalam jangka panjang lebih mudah karena semua yang Anda lakukan adalah ini:
Itu harus ditampilkan
[1, 2, 3, 4, 6]
.sumber
Lihatlah kode ini. Ini bekerja di setiap browser utama .
Panggil fungsi ini
sumber
for in
-loop dan fakta bahwa skrip bisa berhenti lebih awal, dengan mengembalikan hasil dari loop secara langsung. Hasil positifnya masuk akal;)for( i = 0; i < arr.length; i++ )
akan menjadi pendekatan yang lebih baik karena mempertahankan indeks yang tepat versus pesanan apa pun yang browser memutuskan untuk menyimpan item (denganfor in
). Melakukannya juga memungkinkan Anda mendapatkan indeks array dari suatu nilai jika Anda membutuhkannya.Anda dapat menggunakan lodash _.pull (mutate array), _.pullAt (mutate array) atau _.without (tidak bermutasi array),
sumber
ES6 & tanpa mutasi: (Oktober 2016)
sumber
filter
?array.filter((_, index) => index !== removedIndex);
.Menghapus elemen / string tertentu dari array dapat dilakukan dalam satu-liner:
dimana:
Array : array yang ingin Anda hapus dari sesuatu
stringToRemoveFromArray : string yang ingin Anda hapus dan 1 adalah jumlah elemen yang ingin Anda hapus.
CATATAN : Jika "stringToRemoveFromArray" tidak ditemukan dalam array Anda, ini akan menghapus elemen terakhir array.
Itu selalu praktik yang baik untuk memeriksa apakah elemen ada di array Anda terlebih dahulu, sebelum menghapusnya.
Jika Anda memiliki akses ke versi Ecmascript yang lebih baru di komputer klien Anda (PERINGATAN, mungkin tidak berfungsi di stasiun yang lebih lama):
Di mana '3' adalah nilai yang ingin Anda hapus dari array. Array kemudian menjadi:
['1','2','4','5','6']
sumber
"stringToRemoveFromArray"
tidak ditemukan array Anda, ini akan menghapus elemen terakhir array.Berikut adalah beberapa cara untuk menghapus item dari array menggunakan JavaScript .
Semua metode yang dijelaskan tidak bermutasi array asli , dan bukannya membuat yang baru.
Jika Anda tahu indeks suatu barang
Misalkan Anda memiliki array, dan Anda ingin menghapus item di posisinya
i
.Salah satu metode adalah menggunakan
slice()
:slice()
membuat array baru dengan indeks yang diterimanya. Kami cukup membuat array baru, dari awal hingga indeks yang ingin kami hapus, dan menggabungkan array lain dari posisi pertama mengikuti yang kami hapus ke akhir array.Jika Anda tahu nilainya
Dalam hal ini, satu opsi yang baik adalah menggunakan
filter()
, yang menawarkan pendekatan yang lebih deklaratif :Ini menggunakan fungsi panah ES6. Anda dapat menggunakan fungsi tradisional untuk mendukung browser lama:
atau Anda dapat menggunakan Babel dan mengubah kode ES6 kembali ke ES5 untuk membuatnya lebih mudah dicerna oleh browser lama, namun menulis JavaScript modern dalam kode Anda.
Menghapus banyak item
Bagaimana jika alih-alih satu item, Anda ingin menghapus banyak item?
Mari temukan solusi paling sederhana.
Menurut indeks
Anda bisa membuat fungsi dan menghapus item secara seri:
Berdasarkan nilai
Anda dapat mencari penyertaan di dalam fungsi panggilan balik:
Hindari mutasi array asli
splice()
(jangan dikacaukan denganslice()
) bermutasi array asli, dan harus dihindari.(awalnya diposting di https://flaviocopes.com/how-to-remove-item-from-array/ )
sumber
OK, misalnya Anda memiliki array di bawah ini:
Dan kami ingin menghapus nomor 4. Anda cukup menggunakan kode di bawah ini:
Jika Anda menggunakan kembali fungsi ini, Anda menulis fungsi yang dapat digunakan kembali yang akan dilampirkan ke fungsi array asli seperti di bawah ini:
Tetapi bagaimana jika Anda memiliki array di bawah ini dengan beberapa [5] dalam array?
Kami membutuhkan loop untuk memeriksa semuanya, tetapi cara yang lebih mudah dan lebih efisien adalah menggunakan fungsi JavaScript bawaan, jadi kami menulis fungsi yang menggunakan filter seperti di bawah ini sebagai gantinya:
Juga ada perpustakaan pihak ketiga yang membantu Anda melakukan ini, seperti Lodash atau Underscore. Untuk informasi lebih lanjut, lihat lodash _.pull, _.pullAt atau _.without.
sumber
this.splice(num.indexOf(x), 1);
=>this.splice(this.indexOf(x), 1);
Saya cukup baru dalam JavaScript dan membutuhkan fungsi ini. Saya hanya menulis ini:
Lalu ketika saya ingin menggunakannya:
Output - Seperti yang diharapkan. ["item1", "item1"]
Anda mungkin memiliki kebutuhan yang berbeda dari saya, sehingga Anda dapat dengan mudah memodifikasinya agar sesuai dengan mereka. Saya harap ini membantu seseorang.
sumber
Jika Anda memiliki objek kompleks dalam array, Anda dapat menggunakan filter? Dalam situasi di mana $ .inArray atau array.splice tidak mudah digunakan. Terutama jika objek mungkin dangkal dalam array.
Misalnya jika Anda memiliki objek dengan bidang Id dan Anda ingin objek dihapus dari array:
sumber
Saya ingin menjawab berdasarkan ECMAScript 6 . Asumsikan, Anda memiliki array seperti di bawah ini:
Jika Anda ingin menghapus pada indeks khusus seperti
2
, tulis kode di bawah ini:Tetapi jika Anda ingin menghapus item khusus suka
3
dan Anda tidak tahu indeksnya, lakukan seperti di bawah ini:Petunjuk : silakan gunakan fungsi panah untuk memfilter panggilan balik kecuali Anda akan mendapatkan array kosong.
sumber
Pembaruan: Metode ini disarankan hanya jika Anda tidak dapat menggunakan ECMAScript 2015 (sebelumnya dikenal sebagai ES6). Jika Anda dapat menggunakannya, jawaban lain di sini menyediakan implementasi yang lebih rapi.
Inti ini di sini akan menyelesaikan masalah Anda, dan juga menghapus semua kemunculan argumen, bukan hanya 1 (atau nilai yang ditentukan).
Pemakaian:
sumber
Performa
Hari ini (2019-12-09) Saya melakukan tes kinerja pada macOS v10.13.6 (High Sierra) untuk solusi yang dipilih. Saya menunjukkan
delete
(A), tapi saya tidak menggunakannya dibandingkan dengan metode lain, karena ia meninggalkan ruang kosong dalam array.Kesimpulannya
array.splice
(C) (kecuali Safari untuk array kecil di mana ia memiliki kedua kalinya)array.slice+splice
(H) adalah solusi tetap tercepat untuk Firefox dan Safari;Array.from
(B) tercepat di ChromeDetail
Dalam tes saya menghapus elemen tengah dari array dengan berbagai cara. Solusi A, C sudah tersedia. Solusi B, D, E, F, G, H tidak dapat diubah.
Hasil untuk array dengan 10 elemen
Di Chrome,
array.splice
(C) adalah solusi tercepat di tempat. Thearray.filter
(D) adalah solusi berubah tercepat. Paling lambat adalaharray.slice
(F). Anda dapat melakukan tes pada mesin Anda di sini .Hasil untuk array dengan 1.000.000 elemen
Di Chrome,
array.splice
(C) adalah solusi tercepat di tempat (delete
(C) mirip dengan cepat - tetapi ia meninggalkan slot kosong di array (sehingga tidak melakukan 'penghapusan penuh')). Thearray.slice-splice
(H) adalah solusi berubah tercepat. Paling lambat adalaharray.filter
(D dan E). Anda dapat melakukan tes pada mesin Anda di sini .Tampilkan cuplikan kode
Perbandingan untuk browser: Chrome v78.0.0, Safari v13.0.4, dan Firefox v71.0.0
sumber
Anda seharusnya tidak pernah mengubah array Anda. Karena ini bertentangan dengan pola pemrograman fungsional. Anda dapat membuat array baru tanpa merujuk array yang ingin Anda ubah data menggunakan metode ECMAScript 6
filter
;Misalkan Anda ingin menghapus
5
dari array, Anda bisa melakukannya seperti ini:Ini akan memberi Anda array baru tanpa nilai yang ingin Anda hapus. Jadi hasilnya adalah:
Untuk pemahaman lebih lanjut, Anda dapat membaca dokumentasi MDN di Array.filter .
sumber
Yang lebih modern, ECMAScript 2015 (sebelumnya dikenal sebagai Harmony atau ES 6) pendekatan. Diberikan:
Kemudian:
Menghasilkan:
Anda dapat menggunakan Babel dan layanan polyfill untuk memastikan ini didukung dengan baik di seluruh browser.
sumber
.filter
mengembalikan array baru, yang tidak persis sama dengan menghapus elemen dari array yang sama. Manfaat dari pendekatan ini adalah Anda dapat menggabungkan metode array secara bersamaan. mis:[1,2,3].filter(n => n%2).map(n => n*n) === [ 1, 9 ]
splice
atauslice
.items= items.filter(x=>x!=3)
. Selain itu, OP tidak menyatakan persyaratan untuk kumpulan data besar.Anda memiliki 1 hingga 9 dalam array, dan Anda ingin menghapus 5. Gunakan kode di bawah ini:
Jika Anda ingin beberapa nilai. Contoh: - 1,7,8
Jika Anda ingin menghapus nilai array dalam array. Contoh: [3,4,5]
Termasuk tautan yang didukung browser .
sumber
Saya tahu sudah ada banyak jawaban, tetapi banyak dari mereka tampaknya terlalu memperumit masalah. Berikut ini adalah cara sederhana, rekursif untuk menghapus semua instance kunci - panggilan sendiri hingga indeks tidak ditemukan. Ya, itu hanya bekerja di browser dengan
indexOf
, tetapi sederhana dan dapat dengan mudah diisi.Fungsi yang berdiri sendiri
Metode prototipe
sumber
Anda dapat melakukan loop mundur untuk memastikan tidak mengacaukan indeks, jika ada beberapa contoh elemen.
Demo Langsung
sumber