JQuery kullanarak diziden belirli bir değer nasıl kaldırılır


419

Şöyle bir dizi var: var y = [1, 2, 3];

2Diziden kaldırmak istiyorum y.

JQuery kullanarak bir diziden belirli bir değeri nasıl kaldırabilirim? Ben denedim pop()ama bu her zaman son elemanı kaldırır.


8
UYARI : en çok oylanan yanıtların bazılarının yan etkileri olabilir, örneğin dizi kaldırılacak öğeyi içermiyorsa yanlış işlemler yapmak. Lütfen bunları dikkatli kullanın .
Ricardo

Bu cevap benim için düz bir javascript ile çalıştı: stackoverflow.com/a/5767357/4681687
chimos

splice () ve $ .inArray () kullanımı altında yorumuma bakın, bir döngü kullanmadan bu sorunu çözdüm ve temiz.
user253780

Yanıtlar:


619

Çalışan bir JSFIDDLE

Bunun gibi bir şey yapabilirsiniz:

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

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

Sonuç:

[1, 3]

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


2
Bu iyi haber ve evet doğru modifikasyona ihtiyaç duyuldu :)
Sarfraz

2
Ben varsayılan kullanıcı yöntemi ile ilgili @ user113716 cevap doğru yol olduğunu düşünüyorum. Herhangi bir yerel yöntem her zaman tercih edilecek ve daha hızlı olacaktır.
neoswf

114
Bu cevap tamamen yanlış değil mi? Diziden bir öğeyi kaldırmayan, eksik bir öğeyle yeni bir dizi oluşturuyor. Bunlar aynı şey değil.
James Moore

5
Bu karmaşıklığı O (n) olan bir kaldırma ... dizideki daha fazla değer, en kötü olacak ...
Lyth

2
O (n) 'nin karmaşıklığı bir mesele değildir.
Omar Tariq

370

JQuery ile aşağıdaki gibi tek satırlı bir işlem yapabilirsiniz:

Örnek: http://jsfiddle.net/HWKQY/

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

Yerli .splice()ve jQuery'leri kullanır $.inArray().


13
@Elankeeran - Bir şey değil. : o) Bunun yalnızca ilk örneği kaldıracağını belirtmeliyim. Kaldırılacak birden çok öğe varsa, işe yaramaz.
user113716

7
Ayrıca removeItem dizide mevcut olmayan bir değere değiştirildi ve dizideki son öğe kaldırıldı. RemoveItem'in varlığından emin değilseniz bunu kullanın: y = $ .grep (y, function (val) {return val! = RemoveItem;});
Solburn

52
UYARI - Yanlış ürünü çıkarabilir! $ .inArray değeri yoksa ve .splice negatif dizini 'sondan' olarak görürse, kaldırmaya çalıştığınız değer yoksa, bunun yerine başka bir değer kaldırılır. Ayrıca $ .grep tüm olayları kaldıracak, ancak bu yöntem yalnızca ilkini kaldıracaktır.
Ryan Williams

1
Yukarıda açıklanan her iki sorunu da gidermek için bir whiledöngü ve bunun gibi geçici bir değişken kullanın :var found; while ((found = $.inArray(removeItem, y)) !== -1) y.splice(found, 1);

1
.indexOf()JQuery yerine ES5 ile çok daha güzel olsa da , bir sonraki aramanın başlangıç ​​noktası olarak bulunan son dizini kullanabileceğiniz için, her seferinde tüm diziyi aramaktan çok daha verimlidir. var found=0; while ((found = y.indexOf(removeItem, found)) !== -1) y.splice(found, 1);

50

jQuery.filteryöntem yararlıdır. Bu Arraynesneler için kullanılabilir .

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/

Ecmascript 6'da:

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

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


4
Gerçekte mevcut diziyi değiştirmese de yeni bir tane oluştursa bile, önerilen çözümlerden en iyi şekilde yararlanıyor gibi görünüyor. Ayrıca mevcut olmayan değerlerle veya boş bir diziyle çalışır. JSFiddle'da hızlı performans kontrolü yaptım: 800.000 değere sahip bir dizi ile tamamlanması yaklaşık 6 saniye sürdü. Bunun hızlı olup olmadığından emin değilim.
Flo

2
Bu çözüm, jQuery filtre yöntemi DEĞİL vanilya JS yüksek dereceli fonksiyon filtresi kullanıyor .
Kalimah

Onu seviyorum! Jquery olmasa bile en iyi çözüm gibi görünüyor ...
Sam

36

Underscore.js dosyasını kullanabilirsiniz . Gerçekten işleri basitleştirir.

Sizin durumunuzda yazmanız gereken tüm kod -

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

ve sonuç [1,3] olacaktır.

Yazdığınız kodu azaltır.


34

Bir jQuery yolu değil ama ... Neden daha basit bir yol kullanmıyorsunuz? Aşağıdaki diziden 'c' işaretini kaldır

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

Ayrıca şunları da kullanabilirsiniz: (Kendime not : Sahip olmadığınız nesneleri değiştirmeyin )

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

Eklemek daha basita.push('c')


9
Çalışmıyor. Bulunmazsa dizideki son öğeyi kaldırır.
Timothy Aaron

7
indexOf, IE8-'de desteklenmez.
Boude

1
Mükemmel çalıştı, teşekkürler.
Jay Momaya

22

Dizideki Öğeyi Kaldır

var arr = ["jQuery", "JavaScript", "HTML", "Ajax", "Css"];
var itemtoRemove = "HTML";
arr.splice($.inArray(itemtoRemove, arr), 1);

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

Kullanım örneği

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

Bu prototip işlevini kullanmak için onu kodunuza yapıştırmanız gerekir. Ardından, 'nokta notasyonu' olan herhangi bir diziye uygulayabilirsiniz:

someArr.remove('elem1')

Biraz daha fazla açıklama burada özledim olmaz!
Gaz Kış

Bu prototip işlevini kullanmak için onu kodunuza yapıştırmanız gerekir. Ardından, 'nokta notasyonu' olan herhangi bir diziye uygulayabilirsiniz, örneğin: someArr.remove ('elem1')
yesnik

3
Böyle bir şeyle ilgili tek sorun, global Array nesnesinin remove yönteminin üzerine yazılmasıdır, yani projedeki varsayılan davranışa bağlı olan diğer tüm kodların buggy davranışı ile sonuçlanması anlamına gelir.
jmort253

2
Başka bir sorun, global değişkenin iüzerine yazılmasıdır.
Roland Illig


5

.Not işlevini şu şekilde kullanabilirsiniz:

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

var newArr = $(arr).not([searchValue]).get();

2
Değer orada değilse tüm diziyi siler, böylece bir searchValue = 4 boş bir dizi döndürür.
Julian K

3
Kod jsfiddle içine kopyaladım, searchValue4 olarak değiştirdim , kodu çalıştırdım, sorun tespit edilmedi. Tüm değerler hala mevcuttu @ JulianK
RST

4

User113716 yanıtımın sürümü. Herhangi bir eşleşme bulunmazsa, onun değeri kaldırır, ki bu iyi değildir.

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

var i = $.inArray(removeItem,y)

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

alert(y);

Bu, bir eşleşme bulunursa 1 öğeyi, eşleşme bulunmazsa 0 öğesini kaldırır.

Nasıl çalışır:

  • $ .inArray (değer, dizi) bir birinci indeks bulan bir jQuery fonksiyonudur valuebir inarray
  • Değer bulunmazsa yukarıdaki -1 değerini döndürür, bu nedenle kaldırma işlemini yapmadan önce i'nin geçerli bir dizin olduğunu kontrol edin. -1 dizinini kaldırmak, sonuncunun kaldırılması anlamına gelir, bu da burada yararlı değildir.
  • .splice (dizin, sayımı) kaldırır countdeğerlerin sayısı başlayan indexbiz sadece bir istiyorum böylece, countarasında1

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;

3

Ekleme ile basit bir çözüm var. W3School ek yeri sözdizimine göre ;

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

dizin Gerekli. Hangi konuma öğe ekleneceğini / kaldırılacağını belirten bir tamsayı, Dizinin sonundaki konumu belirtmek için negatif değerleri kullanın

howmany Gerekli. Kaldırılacak öğe sayısı. 0 olarak ayarlanırsa, hiçbir öğe kaldırılmaz

item1, ..., itemX İsteğe bağlı. Diziye eklenecek yeni öğeler

Unutmayın, aşağıdaki js bulunursa verilen diziden bir veya daha fazla eşleşen öğeyi açar, aksi takdirde dizinin son öğesini kaldırmaz.

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;

Veya

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

Yani final aşağıdaki gibi olmalı

x.splice( startItemIndex , itemsFound );

Bu yardımcı olur umarım.


3

İlk önce öğenin dizide olup olmadığını kontrol eder

$.inArray(id, releaseArray) > -1

yukarıdaki satır dizide varsa o öğenin dizinini döndürür, aksi takdirde -1 döndürür

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

Şimdi satırın yukarısında ise bu öğeyi diziden kaldırır. Aşağıdaki mantığı özetlemek için öğeyi diziden kontrol etmek ve kaldırmak için gerekli kod vardır.

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

2

Dizideki nesnelerin bir özelliğine dayalı olarak aynı anda birden çok nesneyi silmek için gereken benzer bir görev vardı.

Bu yüzden birkaç tekrardan sonra:

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

2

Array sınıfını aşağıdaki pick_and_remove()gibi bir işlevle genişletirim :

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

Biraz ayrıntılı görünse de, artık pick_and_remove() istediğiniz diziyi !

Kullanımı:

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

Tüm bunları burada pokemon temalı eylemde görebilirsiniz.


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

Daha sonra işlevi kodunuzun herhangi bir yerine çağırabilirsiniz.

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"!

Bu her durumda çalışır ve yukarıdaki yöntemlerde problemleri önler. Umarım yardımcı olur!


2

Bunu dene benim için çalışıyor

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

2

Burada en çok oylanan ikinci cevap, OP'nin istediği amaçlanan bir tek katlı jQuery yöntemine mümkün olan en yakın yolda, ancak kodlarının sonunda tökezledi ve bir kusuru var. Kaldırılacak öğeniz aslında dizide yoksa, son öğe kaldırılır.

Birkaç kişi bu sorunu fark etti ve bazıları buna karşı korunmak için döngü kurmayı önerdi. Bulabildiğim en kısa, en temiz yöntemi sunuyoruz ve bu yönteme göre kodlarını düzeltmenin yolu için kendi cevapları altında yorum yaptım.

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

x dizisi "bye" öğesini kolayca kaldıracak ve y dizisi dokunulmayacaktır.

Argümanın $.inArray(removeItem,array)ikinci bir argüman olarak kullanılması aslında birleşme uzunluğu olarak sonuçlanır. Öğe bulunamadığı için, bu değerlendirilir array.splice(-1,-1);, bu da hiçbir şeyin birleştirilmesine neden olmaz ... hepsi bunun için bir döngü yazmak zorunda kalmadan.


1

Vanilya JavaScript kullanarak 2 diziden güvenle kaldırmak için:

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

Çoklu dolgu kaynağı: Mozilla


0

Sadece Sarfraz'ın cevabına eklemek için, kimsenin henüz bir işlevi yerine getirmediğini şaşırttı.

Dizinizde birden çok aynı değere sahipseniz, .filter yöntemini kullanarak ddagsan'ın yanıtını kullanın.

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>

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.