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?


5
Kombinasi .indexOf()dan .splice()harus melakukan trik. Atau mungkin, sebagai alternatif .filter(),.
Marc B


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

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

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

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.


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

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)


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.



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'


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.