Cara menghapus nilai spesifik dari array menggunakan jQuery

419

Saya memiliki array yang terlihat seperti ini: var y = [1, 2, 3];

Saya ingin menghapus 2dari array y.

Bagaimana saya bisa menghapus nilai tertentu dari array menggunakan jQuery? Saya sudah mencoba pop()tetapi itu selalu menghilangkan elemen terakhir.

Elankeeran
sumber
8
PERINGATAN : beberapa jawaban yang paling banyak dipilih mungkin memiliki efek samping, misalnya, melakukan operasi yang salah ketika array tidak mengandung elemen yang akan dihapus. Silakan gunakan dengan hati-hati .
Ricardo
Jawaban ini berhasil bagi saya, dengan javascript biasa: stackoverflow.com/a/5767357/4681687
chimos
lihat komentar saya di bawah penggunaan splice () dan $ .inArray (), saya telah memecahkan masalah ini TANPA menggunakan loop, dan itu bersih.
user253780

Jawaban:

619

JSFIDDLE yang berfungsi

Anda dapat melakukan sesuatu seperti ini:

var y = [1, 2, 2, 3, 2]
var removeItem = 2;

y = jQuery.grep(y, function(value) {
  return value != removeItem;
});

Hasil:

[1, 3]

http://snipplr.com/view/14381/remove-item-from-array-with-jquery/

Sarfraz
sumber
2
Itu adalah berita baik dan ya modifikasi yang tepat diperlukan :)
Sarfraz
2
Saya pikir jawaban @ user113716, mengenai metode JS default adalah cara yang benar. Metode asli apa pun akan selalu lebih disukai dan lebih cepat.
neoswf
114
Bukankah jawaban ini sepenuhnya salah? Itu menciptakan array baru dengan item yang hilang, tidak menghapus item dari array. Itu sama sekali bukan hal yang sama.
James Moore
5
Itu adalah penghapusan dengan kompleksitas O (n) ... semakin banyak nilai dalam array, yang terburuk adalah ...
Lyth
2
Kompleksitas O (n) tidak menjadi masalah.
Omar Tariq
370

Dengan jQuery, Anda dapat melakukan operasi satu baris seperti ini:

Contoh: http://jsfiddle.net/HWKQY/

y.splice( $.inArray(removeItem, y), 1 );

Menggunakan asli .splice()dan jQuery $.inArray().

pengguna113716
sumber
13
@Elankeeran - Sama-sama. : o) Saya harus mencatat bahwa ini hanya akan menghapus instance pertama. Jika ada beberapa yang harus dihapus, itu tidak akan berfungsi.
user113716
7
Saya juga mengubah removeItem ke nilai yang TIDAK ada dalam array dan menghapus item terakhir dalam array. Gunakan ini jika Anda tidak yakin dengan keberadaan RemoveItem: y = $ .grep (y, function (val) {return val! = RemoveItem;});
Solburn
52
PERINGATAN - Dapat menghapus item yang salah! $ .inArray mengembalikan -1 jika nilainya tidak ada dan .splice memperlakukan indeks negatif sebagai 'dari akhir' sehingga jika nilai yang Anda coba hapus tidak ada, beberapa nilai lain akan dihapus sebagai gantinya. $ .Grep juga akan menghapus semua kejadian sedangkan metode ini hanya akan menghapus yang pertama.
Ryan Williams
1
Untuk memperbaiki kedua masalah yang dijelaskan di atas, gunakan whileloop dan variabel sementara seperti ini:var found; while ((found = $.inArray(removeItem, y)) !== -1) y.splice(found, 1);
1
Meskipun jauh lebih baik dengan ES5 .indexOf()daripada jQuery karena Anda dapat menggunakan indeks terakhir yang ditemukan sebagai titik awal untuk pencarian berikutnya, yang jauh lebih efisien daripada mencari seluruh array setiap waktu. var found=0; while ((found = y.indexOf(removeItem, found)) !== -1) y.splice(found, 1);
51

jQuery.filtermetode bermanfaat. Ini tersedia untuk Arrayobjek.

var arr = [1, 2, 3, 4, 5, 5];

var result = arr.filter(function(elem){
   return elem != 5; 
});//result -> [1,2,3,4]

http://jsfiddle.net/emrefatih47/ar0dhvhw/

Dalam Ecmascript 6:

let values = [1,2,3,4,5];
let evens = values.filter(v => v % 2 == 0);
alert(evens);

https://jsfiddle.net/emrefatih47/nnn3c2fo/

ddagsan
sumber
4
Tampaknya bekerja yang terbaik dari solusi yang diusulkan, meskipun sebenarnya tidak mengubah array yang ada tetapi menciptakan yang baru. Ini juga berfungsi dengan nilai yang tidak ada atau array kosong. Pemeriksaan kinerja cepat di JSFiddle yang saya lakukan: dengan array dengan nilai 800.000 dibutuhkan sekitar 6 detik untuk menyelesaikan. Tidak yakin apakah itu cepat.
Flo
2
Solusi ini menggunakan filter fungsi pesanan tinggi vanilla JS, BUKAN metode filter jQuery.
Kalimah
Aku menyukainya! Tampaknya solusi terbaik meskipun bukan jquery ...
Sam
36

Anda dapat menggunakan underscore.js . Ini benar-benar membuat semuanya menjadi sederhana.

Dalam kasus Anda, semua kode yang harus Anda tulis adalah -

_.without([1,2,3], 2);

dan hasilnya adalah [1,3].

Ini mengurangi kode yang Anda tulis.

Vatsal
sumber
34

Bukan cara jQuery tapi ... Kenapa tidak menggunakan cara yang lebih sederhana. Hapus 'c' dari array berikut

var a = ['a','b','c','d']
a.splice(a.indexOf('c'),1);
>["c"]
a
["a", "b", "d"]

Anda juga dapat menggunakan: (Catatan untuk diri sendiri: Jangan memodifikasi objek yang tidak Anda miliki )

Array.prototype.remove = function(v) { this.splice(this.indexOf(v) == -1 ? this.length : this.indexOf(v), 1); }
var a = ['a','b','c'];
a.remove('c'); //value of "a" is now ['a','b']

Menambahkan lebih sederhanaa.push('c')

Aamir Afridi
sumber
9
Tidak bekerja Menghapus item terakhir dalam array jika tidak ditemukan.
Timothy Aaron
7
indexOf tidak didukung di IE8-.
Boude
1
Bekerja dengan baik, terima kasih.
Jay Momaya
22

Hapus Item di Array

var arr = ["jQuery", "JavaScript", "HTML", "Ajax", "Css"];
var itemtoRemove = "HTML";
arr.splice($.inArray(itemtoRemove, arr), 1);
praveen d
sumber
14
//This prototype function allows you to remove even array from array
Array.prototype.remove = function(x) { 
    var i;
    for(i in this){
        if(this[i].toString() == x.toString()){
            this.splice(i,1)
        }
    }
}

Contoh penggunaan

var arr = [1,2,[1,1], 'abc'];
arr.remove([1,1]);
console.log(arr) //[1, 2, 'abc']

var arr = [1,2,[1,1], 'abc'];
arr.remove(1);
console.log(arr) //[2, [1,1], 'abc']

var arr = [1,2,[1,1], 'abc'];
arr.remove('abc');
console.log(arr) //[1, 2, [1,1]]

Untuk menggunakan fungsi prototipe ini, Anda perlu menempelkannya di kode Anda. Kemudian Anda bisa menerapkannya ke sembarang array dengan 'notasi titik':

someArr.remove('elem1')
yesnik
sumber
Penjelasan lebih lanjut tidak akan ketinggalan di sini!
Gaz Winter
Untuk menggunakan fungsi prototipe ini, Anda perlu menempelkannya di kode Anda. Kemudian Anda dapat menerapkannya ke sembarang array dengan 'notasi titik', misalnya: someArr.remove ('elem1')
yesnik
3
Satu-satunya masalah dengan sesuatu seperti ini adalah ia menimpa metode penghapusan objek global Array, yang berarti kode lain dalam proyek yang tergantung pada perilaku default yang berakhir dengan perilaku buggy.
jmort253
2
Masalah lain adalah bahwa variabel global iditimpa.
Roland Illig
5

Anda dapat menggunakan .tidak berfungsi seperti ini:

var arr = [ 1 , 2 , 3 , 5 , 8];
var searchValue = 2;

var newArr = $(arr).not([searchValue]).get();
Vahid Khakestani
sumber
2
Ini akan menghapus seluruh array jika nilainya tidak ada di sana, jadi searchValue = 4 akan mengembalikan array kosong.
Julian K
3
Saya telah menyalin kode ke jsfiddle, diubah searchValuemenjadi 4, jalankan kodenya, tidak ada masalah yang terdeteksi. Semua nilai masih ada. @ JulianK
RST
4

Versi saya dari jawaban user113716. Nya menghapus nilai jika tidak ada kecocokan yang ditemukan, yang tidak baik.

var y = [1, 2, 3]
var removeItem = 2;

var i = $.inArray(removeItem,y)

if (i >= 0){
    y.splice(i, 1);
}

alert(y);

Ini sekarang menghapus 1 item jika kecocokan ditemukan, 0 jika tidak ada kecocokan yang ditemukan.

Bagaimana itu bekerja:

  • $ .inArray (value, array) adalah fungsi jQuery yang menemukan indeks pertama valuedalamarray
  • Di atas mengembalikan -1 jika nilainya tidak ditemukan, jadi periksa bahwa saya adalah indeks yang valid sebelum kami melakukan penghapusan. Menghapus indeks -1 berarti menghapus yang terakhir, yang tidak membantu di sini.
  • .splice (indeks, count) menghapus countjumlah nilai mulai index, jadi kami hanya ingin countof1
andrewb
sumber
3
//in case somebody needs something like this:  multidimensional array (two items)

var ar = [[0,'a'],[1,'b'],[2,'c'],[3,'d'],[4,'e'],[5,'f']];

var removeItem = 3;  


ar = jQuery.grep(ar, function(n) {
  return n[0] != removeItem;   //or n[1] for second item in two item array
});
ar;
Marijan Vukcevich
sumber
3

Ada solusi sederhana dengan sambatan. Menurut sintaks sambatan W3School adalah sebagai berikut;

array.splice(index, howmany, item1, ....., itemX)

Diperlukan indeks . Bilangan bulat yang menentukan pada posisi apa untuk menambah / menghapus item, Gunakan nilai negatif untuk menentukan posisi dari akhir array

berapa banyak dibutuhkan. Jumlah item yang akan dihapus. Jika diatur ke 0, tidak ada item yang akan dihapus

item1, ..., itemX Opsional. Item baru yang akan ditambahkan ke array

Ingatlah itu, js berikut akan memunculkan satu atau lebih item yang cocok dari array yang diberikan jika ditemukan, jika tidak, tidak akan menghapus item terakhir dari array.

var x = [1,2,3,4,5,4,4,6,7];
var item = 4;
var startItemIndex = $.inArray(item, x);
var itemsFound = x.filter(function(elem){
                            return elem == item;
                          }).length;

Atau

var itemsFound = $.grep(x, function (elem) {
                              return elem == item;
                           }).length;

Jadi final harus terlihat seperti berikut

x.splice( startItemIndex , itemsFound );

Semoga ini membantu.

Mahib
sumber
3

Pertama memeriksa apakah elemen ada dalam array

$.inArray(id, releaseArray) > -1

baris di atas mengembalikan indeks elemen itu jika ada dalam array, jika tidak mengembalikan -1

 releaseArray.splice($.inArray(id, releaseArray), 1);

sekarang baris di atas akan menghapus elemen ini dari array jika ditemukan. Untuk meringkas logika di bawah ini adalah kode yang diperlukan untuk memeriksa dan menghapus elemen dari array.

  if ($.inArray(id, releaseArray) > -1) {
                releaseArray.splice($.inArray(id, releaseArray), 1);
            }
            else {
                releaseArray.push(id);
            }
Luqman Cheema
sumber
2

Saya punya tugas serupa di mana saya perlu menghapus beberapa objek sekaligus berdasarkan properti dari objek dalam array.

Jadi setelah beberapa iterasi saya berakhir dengan:

list = $.grep(list, function (o) { return !o.IsDeleted });
Bogdan Litescu
sumber
2

Saya akan memperluas kelas Array dengan pick_and_remove()fungsi, seperti:

var ArrayInstanceExtensions = {
    pick_and_remove: function(index){
        var picked_element = this[index];
        this.splice(index,1);
        return picked_element;
    } 
};
$.extend(Array.prototype, ArrayInstanceExtensions);

Meskipun mungkin tampak sedikit bertele-tele, Anda sekarang dapat memanggil pick_and_remove()array yang Anda inginkan!

Pemakaian:

array = [4,5,6]           //=> [4,5,6]
array.pick_and_remove(1); //=> 5
array;                    //=> [4,6]

Anda dapat melihat semua ini dalam aksi bertema pokemon di sini.

Starkers
sumber
2
/** SUBTRACT ARRAYS **/

function subtractarrays(array1, array2){
    var difference = [];
    for( var i = 0; i < array1.length; i++ ) {
        if( $.inArray( array1[i], array2 ) == -1 ) {
                difference.push(array1[i]);
        }
    }
return difference;
}  

Anda kemudian dapat memanggil fungsi di mana saja dalam kode Anda.

var I_like    = ["love", "sex", "food"];
var she_likes = ["love", "food"];

alert( "what I like and she does't like is: " + subtractarrays( I_like, she_likes ) ); //returns "Naughty :P"!

Ini berfungsi dalam semua kasus dan menghindari masalah dalam metode di atas. Semoga itu bisa membantu!

Kareem
sumber
2

Coba ini bekerja untuk saya

_clientsSelected = ["10", "30", "12"];
function (removeItem) {
console.log(removeItem);
   _clientsSelected.splice($.inArray(removeItem, _clientsSelected), 1);
   console.log(_clientsSelected);
`enter code here`},
Baume baptiste
sumber
2

Jawaban kedua yang paling banyak dipilih di sini adalah pada jalur terdekat yang mungkin dengan metode jQuery satu-baris dari perilaku yang diinginkan OP, tetapi mereka tersandung di akhir kode mereka, dan memiliki kelemahan. Jika item Anda untuk dihapus sebenarnya tidak ada dalam array, item terakhir akan dihapus.

Beberapa telah memperhatikan masalah ini, dan beberapa telah menawarkan cara-cara untuk mencegahnya. Saya menawarkan metode terpendek, terbersih yang dapat saya temukan, dan saya telah berkomentar di bawah jawaban mereka untuk cara memperbaiki kode mereka sesuai dengan metode ini.

var x = [1, 2, "bye", 3, 4];
var y = [1, 2, 3, 4];
var removeItem = "bye";

// Removing an item that exists in array
x.splice( $.inArray(removeItem,x), $.inArray(removeItem,x) ); // This is the one-liner used

// Removing an item that DOESN'T exist in array
y.splice( $.inArray(removeItem,y), $.inArray(removeItem,y) ); // Same usage, different array

// OUTPUT -- both cases are expected to be [1,2,3,4]
alert(x + '\n' + y);

array x akan menghapus elemen "bye" dengan mudah, dan array y akan tersentuh.

Penggunaan argumen $.inArray(removeItem,array)sebagai argumen kedua benar-benar berakhir menjadi panjang untuk sambungan. Karena item tidak ditemukan, ini dievaluasi menjadi array.splice(-1,-1);, yang hanya akan menghasilkan tidak ada yang disambung ... semua tanpa harus menulis loop untuk ini.

pengguna253780
sumber
1

Untuk menghapus 2 dari array dengan aman menggunakan JavaScript vanilla:

// Define polyfill for browsers that don't natively support Array.indexOf()
if (!Array.prototype.indexOf) {
  Array.prototype.indexOf = function(searchElement, fromIndex) {
    var k;
    if (this===null) {
      throw new TypeError('"this" is null or not defined');
    }
    var O = Object(this),
      len = O.length >>> 0;
    if (len===0) return -1;
    var n = +fromIndex || 0;
    if (Math.abs(n)===Infinity) n = 0;
    if (n >= len) return -1;
    k = Math.max(n >= 0 ? n : len - Math.abs(n), 0);
    while (k < len) {
      if (k in O && O[k]===searchElement) return k;
      ++k;
    }
    return -1;
  };
}

// Remove first instance of 2 from array
if (y.indexOf(2) > -1) {
  y.splice(y.indexOf(2), 1);
}

/* To remove all instances of 2 from array, change 'if' to 'while':
while (y.indexOf(2) > -1) {
  y.splice(y.indexOf(2), 1);
}
*/

console.log(y);  // Returns [1, 3]

Sumber polyfill: Mozilla

Terima kasih
sumber
0

Hanya untuk menambah jawaban dari Sarfraz, belum ada yang terkejut membuatnya menjadi fungsi.

Gunakan jawaban dari ddagsan menggunakan metode .filter jika Anda memiliki nilai yang sama lebih dari satu kali dalam array Anda.

function arrayRemoveVal(array, removeValue){
	var newArray = jQuery.grep(array, function(value) {return value != removeValue;});
	return newArray;
}
var promoItems = [1,2,3,4];	
promoItems = arrayRemoveVal(promoItems, 3);// removes 3
console.log(promoItems);
promoItems = arrayRemoveVal(promoItems, 3);// removes nothing
console.log(promoItems);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.2.3/jquery.min.js"></script>

Bim
sumber