Pencarian array Javascript dan menghapus string?

134

Saya sudah:

var array = new Array();
array.push("A");
array.push("B");
array.push("C");

Saya ingin dapat melakukan sesuatu seperti:

array.remove("B");

tetapi tidak ada fungsi hapus. Bagaimana saya mencapai ini?

Rolando
sumber
5
Kombinasi .indexOf()dan .splice()harus melakukan trik. Atau mungkin, sebagai alternatif .filter(),.
Marc B
1
lihat di sini: stackoverflow.com/questions/3954438/…
benedict_w
Kemungkinan duplikat dari Bagaimana cara menghapus item dari array dengan nilai?
totymedli

Jawaban:

186

Saya sebenarnya memperbarui utas ini dengan solusi 1-baris yang lebih baru:

let arr = ['A', 'B', 'C'];
arr = arr.filter(e => e !== 'B'); // will return ['A', 'C']

Idenya pada dasarnya adalah untuk memfilter array dengan memilih semua elemen yang berbeda untuk elemen yang ingin Anda hapus.

Catatan: akan menghapus semua kemunculan.

EDIT:

Jika Anda ingin menghapus hanya kejadian pertama:

t = ['A', 'B', 'C', 'B'];
t.splice(t.indexOf('B'), 1); // will return ['B'] and t is now equal to ['A', 'C', 'B']
Tyrannas
sumber
1
Solusi ini mengembalikan salinan array, sedangkan menggunakan splice menghilangkan elemen di tempatnya. Yang Anda pilih tergantung pada konteks.
twhitehead
6
Ini sempurna untuk hal-hal Redux di mana Anda harus mengembalikan status baru.
colinwong
@Regis sebenarnya tidak, arr.filter mengembalikan array baru. Jadi arr.filter (e => e! == 'B') tidak akan mengubah arr. Atau mungkin saya tidak mengerti komentar Anda dengan benar?
Tyrannas
apakah ada metode untuk melakukan ini tetapi berhenti pada kejadian pertama? jadi jika ada 5 'B untuk hanya menghapus satu?
Ari
1
@Ari Saya telah memperbarui jawaban untuk menghapus hanya satu elemen
Tyrannas
171

Ulangi daftar dalam urutan terbalik, dan gunakan .splicemetode ini.

var array = ['A', 'B', 'C']; // Test
var search_term = 'B';

for (var i=array.length-1; i>=0; i--) {
    if (array[i] === search_term) {
        array.splice(i, 1);
        // break;       //<-- Uncomment  if only the first term has to be removed
    }
}

Urutan terbalik penting ketika semua kemunculan istilah pencarian harus dihapus. Jika tidak, penghitung akan meningkat, dan Anda akan melewatkan elemen.

Ketika hanya kejadian pertama yang harus dihapus, yang berikut ini juga akan berfungsi:

var index = array.indexOf(search_term);    // <-- Not supported in <IE9
if (index !== -1) {
    array.splice(index, 1);
}
Rob W
sumber
1
Saya menduga karena itu dimaksudkan untuk menjadi sedikit lebih cepat untuk beralih secara terbalik.
Ben Clayton
1
@ BenClayton: Terima kasih. FWIW, dalam JavaScript, itu tidak sepenuhnya benar. Menghitung mundur ke 0tidak secara otomatis lebih cepat seperti di, katakanlah, C. Selama Anda cache batas, tentu saja, yang akan menyulitkan hal-hal jika Anda terus setelah pertandingan pertama (tetapi tidak jika Anda berhenti di atasnya).
TJ Crowder
Jika kita ingin kecepatan, mengapa tidak digunakan saat -? : D
Snuffleupagus
11
Ini bukan tentang kecepatan, ia bahkan mengatakan demikian dalam jawabannya. Ini tentang elemen SKIPPING. Jika Anda berada di posisi 5 dan Anda menyambungkan posisi itu, formelry elemen yang terletak di posisi 6 sekarang di 5 . Namun, loop-counter Anda meningkat, iterasi berikutnya adalah posisi 6 dan di situlah Anda melewatkan item. Itu sebabnya itu dalam urutan terbalik.
amenthes
1
Jika Anda menghapus item dalam loop maju, dan item dihapus, iterasi terakhir dapat melempar pengecualian null pointer karena akan merujuk pada indeks yang tidak ada
Drenai
24

Daftar One Liners

Mari kita selesaikan masalah ini untuk array ini:

var array = ['A', 'B', 'C'];

1. Hapus hanya yang pertama: Gunakan Jika Anda yakin item itu ada

array.splice(array.indexOf('B'), 1);

2. Hapus hanya yang terakhir: Gunakan Jika Anda yakin item itu ada

array.splice(array.lastIndexOf('B'), 1);

3. Hapus semua kejadian:

array = array.filter(v => v !== 'B'); 
enesn
sumber
21

DEMO

Anda harus menemukan lokasi dengan apa yang Anda cari .indexOf()kemudian menghapusnya.splice()

function remove(arr, what) {
    var found = arr.indexOf(what);

    while (found !== -1) {
        arr.splice(found, 1);
        found = arr.indexOf(what);
    }
}

var array = new Array();
array.push("A");
array.push("B");
array.push("C");
    
remove(array, 'B');
alert(array)​​​​;

Ini akan menangani semua kejadian.

qwertymk
sumber
Untuk browser yang tidak mendukung .indexOf()Anda dapat menambahkan ini ke file javascript Anda.
qwertymk
ya elegan. Jika Anda memerlukan opsi untuk menghapus hanya beberapa elemen, misalnya hanya yang pertama: yang sama diperbarui: jsfiddle.net/qpZFd/9
sebilasse
Saya selalu mendapatkan error berikut: Uncaught ReferenceError: array is not defined. Apa yang salah?
Pathros
Jika Anda menempuh rute ini, Anda dapat dengan mudah memanfaatkan .indexOf()sedikit saja. Jika Anda meneruskan foundargumen kedua ke .indexOf()panggilan dalam while-loop , elemen-elemen dalam array yang sudah diperiksa dan berakhir tidak sama tidak diperiksa lagi: found = arr.indexOf(what, found);
pimmhogeling
14

Secara sederhana

array.splice(array.indexOf(item), 1);
Mat
sumber
ya kecuali indexOf itu akan kembali -1jika tidak ada yang ditemukan dan whoops, splice akan menghapus 1 elemen dari akhir array
Ricky Spanish
2

Solusi sederhana (ES6)

Jika Anda tidak memiliki elemen duplikat

Array.prototype.remove = function(elem) {
  var indexElement = this.findIndex(el => el === elem);
  if (indexElement != -1)
    this.splice(indexElement, 1);
  return this;
};   

Demo online (biola)

Ali Soltani
sumber
Solusi ini selalu menghilangkan elemen terakhir jika TIDAK ditemukan kecocokan.
markus s
1

Anda harus menulis sendiri hapus. Anda dapat mengulang array, ambil indeks item yang ingin Anda hapus, dan gunakan spliceuntuk menghapusnya.

Atau, Anda dapat membuat array baru, mengulang array saat ini, dan jika objek saat ini tidak cocok dengan yang ingin Anda hapus, letakkan di array baru.

hvgotcodes
sumber
1

menggunakan:

array.splice(2, 1);

Ini menghapus satu item dari array, mulai dari indeks 2 (item ke-3)

Ben Clayton
sumber
1
sebenarnya itu akan menghapus item kedua dari array, indeks dimulai dari nol. pernyataan ini memiliki ambiguitas, contoh yang lebih sederhana bisa seperti array.splice(2,1)yang menghapus 1 item pada indeks 2 dari array. periksa https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/splice untuk detail lebih lanjut
imdzeeshan
1
const changedArray = array.filter( function(value) {
  return value !== 'B'
});

atau Anda dapat menggunakan:

const changedArray = array.filter( (value) => value === 'B');

RubahArray akan berisi tanpa nilai 'B'

siva gopi
sumber