Javascript'teki bir diziden belirli bir eleman nasıl kaldırılır?

Bir tamsayı dizilim var ve ona eleman eklemek için .push() yöntemini kullanıyorum.

Bir diziden belirli bir öğeyi kaldırmanın kolay bir yolu var mı? array.remove(int); gibi bir array.remove(int); karşılığı array.remove(int); .

Temel javascript kullanmam gerekiyor - çerçeveye izin verilmiyor.

6774
24 апр. 24 Nis tarihinde Walker tarafından yapılmıştır 2011-04-24 01:17 '11, 1:17 2011-04-24 01:17
@ 78 cevaplar
  • 1
  • 2
  • 3

Kaldırmak istediğiniz dizi elemanının index bulun ve splice kullanarak bu dizini silin.

Splice () yöntemi, mevcut öğeleri silerek ve / veya yeni öğeler ekleyerek bir dizinin içeriğini değiştirir.

indexOf için tarayıcı desteği sınırlıdır;  Internet Explorer 7 ve 8'de desteklenmemektedir. 

Desteklenmeyen bir tarayıcıda indexOf ihtiyacınız varsa, sonraki polyfill deneyin. Bu polyfill hakkında daha fazla bilgiyi burada bulabilirsiniz .

 Array.prototype.indexOf || (Array.prototype.indexOf = function(d, e) { var a; if (null == this) throw new TypeError('"this" is null or not defined'); var c = Object(this), b = c.length >>> 0; if (0 === b) return -1; a = +e || 0; Infinity === Math.abs(a)  (a = 0); if (a >= b) return -1; for (a = Math.max(0 <= a ? a : b - Math.abs(a), 0); a < b;) { if (a in c  c[a] === d) return a; a++ } return -1 }); 
9765
24 апр. Cevap 24 Nis tarihinde Tom Wadley tarafından verildi. 2011-04-24 01:23 '11, 1:23 2011-04-24 01:23

Bu array.remove(int) nin nasıl davranmasını beklediğinizi bilmiyorum. Düşünebileceğiniz üç olasılık var.

Bir dizi öğesini i dizinine sahip kaldırmak için:

 array.splice(i, 1); 

Her öğeyi diziden bir number değerine sahip kaldırmak istiyorsanız:

border=0
 for(var i = array.length - 1; i >= 0; i--) { if(array[i] === number) { array.splice(i, 1); } } 

Sadece indeksli bir eleman yapmak istiyorsanız, artık var değilim, fakat diğer elemanların indekslerinin değişmesini istemiyorsunuz:

 delete array[i]; 
990
24 апр. Cevap 24 Nisan tarihinde Peter Olson tarafından verilmiştir. 2011-04-24 01:20 '11, 1:20 2011-04-24 01:20

2016 Ekim Düzenlendi

  • Basit, sezgisel ve açık hale getirin ( https://en.wikipedia.org/wiki/Occam%27s_razor )
  • Değiştirmeden yapın (orijinal dizi değişmeden kalacaktır)
  • Tarayıcınız desteklemiyorsa standart JS işlevleriyle yapın - polyfill kullanın

Bu kod örneğinde, bir diziden istenmeyen öğeleri kaldırmak için array.filter (...) işlevini kullanırım, bu işlev orijinal diziyi değiştirmez ve yeni bir tane oluşturur: Tarayıcınız bu işlevi desteklemiyorsa (örneğin, IE sürüm 9'a kadar veya Firefox sürüm 1.5), Mozilla polyfill filtresini kullanmayı düşünün.

Öğe Silme (ECMA-262 Sürümü 5 kodu aka oldstyle JS)

 var value = 3 var arr = [1, 2, 3, 4, 5, 3] arr = arr.filter(function(item) { return item !== value }) console.log(arr) // [ 1, 2, 4, 5 ] 

Bir öğeyi silme (ES2015 kodu)

 let value = 3 let arr = [1, 2, 3, 4, 5, 3] arr = arr.filter(item => item !== value) console.log(arr) // [ 1, 2, 4, 5 ] 

ÖNEMLİ ES2015 "() => {}" ok işlevi sözdizimi genel olarak IE’de desteklenmiyor, sürüm 45’e kadar Chrome, sürüm 22’ye kadar Firefox, sürüm 10’a kadar Safari. ES2015 sözdizimini daha eski tarayıcılarda kullanmak için BabelJS uygulamasını kullanabilirsiniz .


Birden fazla öğe silme (ES2016 kodu)

Bu yöntemin ek bir avantajı, birkaç öğeyi silebilmenizdir.

 let forDeletion = [2, 3, 5] let arr = [1, 2, 3, 4, 5, 3] arr = arr.filter(item => !forDeletion.includes(item)) // !!! Read below about array.includes(...) support !!! console.log(arr) // [ 1, 4 ] 

ÖNEMLİ "array.includes (...)" IE’de, 47 sürümüne kadar Chrome’a, 43 sürümüne kadar Firefox’a, 9 sürümüne kadar Safari’ye ve 14 sürümüne kadar Edge’e desteklenmez.

Birden çok öğeyi kaldırın (gelişmiş deneysel javascript ES2018?)

 // array-lib.js export function remove(...forDeletion) { return this.filter(item => !forDeletion.includes(item)) } // main.js import { remove } from './array-lib.js' let arr = [1, 2, 3, 4, 5, 3] // :: This-Binding Syntax Proposal // using "remove" function as "virtual method" // without extending Array.prototype arr = arr::remove(2, 3, 5) console.log(arr) // [ 1, 4 ] 

50 builtIns = false code = function remove (... forDeletion) {return this.filter (item =>! ForDeletion.includes (item))} let arr = [1, 2, 3, 4, 5, 3] // :: Bu Bağlama Sözdizimi Önerisi // remove işlevini "sanal yöntem" olarak kullanma arr = arr :: remove (2, 3, 5) console.log (arr) // [1, 4] rel = noreferrer> BabelJS'te kendiniz deneyin: )

bilgi

814
19 дек. Cevap Ujeenator tarafından 19 Aralık'ta verildi . 2013-12-19 22:54 '13, 10:54 pm 2013-12-19 22:54

Boş yer kazanmak isteyip istemediğinize bağlı olarak.

Boş bir yuvaya ihtiyacınız varsa, çıkarma işlemi iyi olacaktır:

 delete array[ index ]; 

Bunu yapmazsanız, splice yöntemini kullanmalısınız:

 array.splice( index, 1 ); 

Ve bu öğenin değerine ihtiyacınız varsa, dizinin döndürülen öğesini basitçe kaydedebilirsiniz:

 var value = array.splice( index, 1 )[0]; 

Bunu belirli bir düzende yapmak istiyorsanız, ikincisi için array.shift() veya array.shift() için array.pop() kullanabilirsiniz (ve her ikisi de öğenin değerini döndürür).

Bir öğenin dizinini bilmiyorsanız, onu almak için array.indexOf( item ) kullanabilirsiniz array.indexOf( item ) almak için (in if() veya hepsini almak için while() işlevini kullanabilirsiniz. array.indexOf( item ) , bir dizin ya da bulunmazsa -1 döndürür.

381
24 апр. verilen cevap xavierm02 24 Nis 2011-04-24 01:32 '11, 1:32 2011-04-24 01:32

Bir arkadaşım Internet Explorer 8 ile ilgili bir sorun yaşadı ve bana ne yaptığını gösterdi. Ona bunun yanlış olduğunu söyledim ve bana burada bir cevap aldığını söyledi. Geçerli en iyi yanıt, tüm tarayıcılarda çalışmayacak (örneğin, Internet Explorer 8) ve yalnızca öğenin ilk oluşumunu kaldıracak.

TÜM örnekleri diziden kaldırın

 function remove(arr, item) { for (var i = arr.length; i--;) { if (arr[i] === item) { arr.splice(i, 1); } } } 

Dizi içinde geriye doğru hareket eder (çünkü indeksler ve uzunluk elemanlar çıkarıldıkça değişecektir) ve bulunursa elemanı siler. Tüm tarayıcılarda çalışır.

249
10 авг. Tarafından cevap Ben Lesh Ağu 10 2013-08-10 22:21 '13, 10:21, 2013-08-10 22:21

İki ana yaklaşım var:

  • splice () : anArray.splice(index, 1);

  • delete : delete anArray[index];

Bir dizi için delete kullanırken dikkatli olun. Nesne özniteliklerini kaldırmak için iyidir, ancak diziler için çok iyi değildir. Diziler için splice kullanmak daha iyidir.

Bir dizi için delete kullandığınızda, anArray.length için yanlış sonuçlar anArray.length . Başka bir deyişle, delete , öğeyi siler ancak length özelliğinin değerini güncellemez.

Örneğin, bir silme işleminden sonra dizin numaralarında delikler de bekleyebilirsiniz. Silme işleminden önce olduğu gibi 1,3,4,8,9,11 ve uzunluk indeksleri alabilirsiniz. Bu durumda, dizinler artık tutarlı olmadığından, döngüler for endekslenen tüm bölümler bölünecektir.

Herhangi bir sebepten dolayı, delete komutunu kullanmanız gerekiyorsa, dizilerde yineleme yapmanız gerektiğinde for each döngü için kullanmanız gerekir. Nitekim, mümkünse, her zaman döngüler için indekslenmiş kullanmaktan kaçının. Böylece, kod daha güvenilir ve indekslerle ilgili sorunlara daha az eğilimli olacaktır.

140
21 дек. Cevap Sasa 21 Aralık'ta verildi . 2012-12-21 14:32 '12, 14:32 2012-12-21 14:32
 Array.prototype.remByVal = function(val) { for (var i = 0; i < this.length; i++) { if (this[i] === val) { this.splice(i, 1); i--; } } return this; } //Call like [1, 2, 3, 4].remByVal(3); 

116
24 апр. Cevap Zirak 24 nisan verildi . 2011-04-24 01:20 '11, 1:20 2011-04-24 01:20

indexOf veya splice kullanmanıza gerek yoktur. Ancak, öğenin yalnızca bir tekrarını kaldırmak istiyorsanız daha iyi çalışır.

Bul ve taşı (taşı):

 function move(arr, val) { var j = 0; for (var i = 0, l = arr.length; i < l; i++) { if (arr[i] !== val) { arr[j++] = arr[i]; } } arr.length = j; } 

İndexOf ve splice (indexof) kullanın:

 function indexof(arr, val) { var i; while ((i = arr.indexOf(val)) != -1) { arr.splice(i, 1); } } 

Yalnızca splice kullanın:

 function splice(arr, val) { for (var i = arr.length; i--;) { if (arr[i] === val) { arr.splice(i, 1); } } } 

1000 öğeli bir dizi için düğümlerin sağlama süresi (ortalama 10.000'den fazla çalışma):

İndeks, hareket etmekten yaklaşık 10 kat daha yavaştır. Bir indexOf çağrısının kaldırılmasıyla iyileştirilse bile, hareket etmekten çok daha kötü performans gösterir.

 Remove all occurrences: move 0.0048 ms indexof 0.0463 ms splice 0.0359 ms Remove first occurrence: move_one 0.0041 ms indexof_one 0.0021 ms 
86
19 сент. Cevap 19 Eylül’de verildi. 2013-09-19 04:53 '13 4:53 2013-09-19 04:53

En kolay yol:

 var index = array.indexOf(item); if(index != -1) array.splice( index, 1 ); 
81
02 дек. Cevap Nanego 02 Aralık tarafından verildi. 2017-12-02 20:42 '17, 20:42, 2017-12-02 20:42

Cevap vermek için çok yaşlı, ama bir değer yerine bir kefil sağlayarak birine yardım edebilir.

NOT: bu diziyi günceller ve etkilenen satırları döndürür.

Kullanımı

 var removed = helper.removeOne(arr, row => row.id === 5 ); var removed = helper.remove(arr, row => row.name.startsWith('BMW')); 

tanım

 var helper = { // Remove and return the first occurrence removeOne: function(array, predicate) { for (var i = 0; i < array.length; i++) { if (predicate(array[i])) { return array.splice(i, 1); } } }, // Remove and return all occurrences remove: function(array, predicate) { var removed = []; for (var i = 0; i < array.length;) { if (predicate(array[i])) { removed.push(array.splice(i, 1)); continue; } i++; } return removed; } }; 
58
02 мая '14 в 15:00 2014-05-02 15:00 Cevap 02 Mayıs '14 ve 15:00 2014-05-02 15:00 saatleri arasında verilir.

John Resig iyi bir uygulama yayınladı :

 // Array Remove - By John Resig (MIT Licensed) Array.prototype.remove = function(from, to) { var rest = this.slice((to || from) + 1 || this.length); this.length = from < 0 ? this.length + from : from; return this.push.apply(this, rest); }; 

Genel nesneyi genişletmek istemiyorsanız, aşağıdaki gibi bir şey yapabilirsiniz:

 // Array Remove - By John Resig (MIT Licensed) Array.remove = function(array, from, to) { var rest = array.slice((to || from) + 1 || array.length); array.length = from < 0 ? array.length + from : from; return array.push.apply(array, rest); }; 

Ancak bunu yayınlamamın ana nedeni, kullanıcıları bu sayfadaki yorumlarda önerilen alternatif uygulama konusunda uyarmaktır (14 Aralık 2007):

 Array.prototype.remove = function(from, to){ this.splice(from, (to=[0,from||1,++to-from][arguments.length])<0?this.length+to:to); return this.length; }; 

İlk başta iyi çalışıyor gibi gözüküyor, ama acı verici süreç boyunca, ikincisini dizideki son elemandan uzaklaştırmaya çalışırken çalışmadığını keşfettim. Örneğin, 10 öğeli bir diziniz varsa ve 9. öğeyi bununla kaldırmaya çalışıyorsanız:

 myArray.remove(8); 

Sonuç olarak, 8 elementli bir dizi elde edersiniz. Nedenini bilmiyorum ama John'un orijinal uygulamasının bu sorunu olmadığını onayladım.

55
30 авг. Cevap Roger 30 Ağustos verilmiştir . 2013-08-30 22:07 '13, 10:07 pm 2013-08-30 22:07

Underscore.js , birden fazla tarayıcıyla ilgili sorunları çözmek için kullanılabilir. Varsa, tarayıcının yerleşik yöntemlerini kullanır. Eğer eksiklerse, Internet Explorer'ın eski sürümlerinde olduğu gibi, kendi yöntemlerini kullanır.

Öğeleri bir diziden kaldırmak için basit bir örnek (bir web sitesinden):

 _.without([1, 2, 1, 0, 3, 1, 4], 0, 1); // => [2, 3, 4] 
53
30 мая '14 в 12:57 2014-05-30 12:57 Cevap 30 Mayıs 14’te vatsal tarafından 12:57 2014-05-30 12:57 tarihinde verilir.

Bunu filtre yöntemiyle kolayca yapabilirsiniz:

 function remove(arrOriginal, elementToRemove){ return arrOriginal.filter(function(el){return el !== elementToRemove}); } console.log( remove([1, 2, 1, 0, 3, 1, 4], 1) ); 

Bu, dizideki tüm öğeleri kaldırır ve ayrıca dilim ve indexOf kombinasyonundan daha hızlı çalışır.

52
11 февр. Cevap Salvador Dali tarafından 11 Şubat'ta verildi. 2014-02-11 01:06 14, 01:06 2014-02-11 01:06

Silinen konumlara sahip yeni bir dizi silmek istiyorsanız, belirli bir öğeyi her zaman silebilir ve diziyi filtreleyebilirsiniz. Dizi yöntemini, filtre yöntemini uygulamayan tarayıcılar için genişletmeniz gerekebilir, ancak uzun vadede daha kolaydır, çünkü tek yapmanız gereken:

 var my_array = [1,2,3,4,5,6]; delete my_array[4]; console.log(my_array.filter(function(a){return typeof a !== 'undefined';})); 

[1, 2, 3, 4, 6]

40
18 окт. Yanıtla Loupax 18 Eki 2012-10-18 13:13 '12 13:13 2012-10-18 13:13

ES6'yı kullanabilirsiniz.

 var array=['1','2','3','4','5','6'] var index = array.filter((value)=>value!='3'); 

çıktı:

 ["1", "2", "4", "5", "6"] 
37
04 окт. Cevap rajat44 04 ekim. 2016-10-04 11:07 '16, 11:07 2016-10-04 11:07

Bu kodu kontrol et. Her büyük tarayıcıda çalışır. .

 remove_item = function (arr, value) { var b = ''; for (b in arr) { if (arr[b] === value) { arr.splice(b, 1); break; } } return arr; } 

Bu fonksiyonu çağır

 remove_item(array,value); 
34
02 апр. Cevap Ekramul Hoque 02 Nisan. 2013-04-02 13:56 13, 13: 56'da , 2013-04-02 13:56

Lodash _ kullanabilirsiniz . çekin ( mutate dizisi), _.pullAt ( mutate dizisi) veya _. olmadan (diziyi değiştirmez),

 var array1 = ['a', 'b', 'c', 'd'] _.pull(array1, 'c') console.log(array1) // ['a', 'b', 'd'] var array2 = ['e', 'f', 'g', 'h'] _.pullAt(array2, 0) console.log(array2) // ['f', 'g', 'h'] var array3 = ['i', 'j', 'k', 'l'] var newArray = _.without(array3, 'i') // ['j', 'k', 'l'] console.log(array3) // ['i', 'j', 'k', 'l'] 
32
25 авг. Cevap Chun Yang 25 Ağustos'ta verilir . 2015-08-25 22:34 '15, 10:34, 2015-08-25 22:34

Tamam, örneğin, aşağıda bir diziniz var:

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

Ve 4 sayısını silmek istiyoruz, sadece aşağıdaki kodu yapabilirsiniz:

 num.splice(num.indexOf(4), 1); //num will be [1, 2, 3, 5]; 

Bu işlevi yeniden kullanırsanız, aşağıda gösterildiği gibi Yerel dizi işlevine bağlanacak bir yeniden kullanım işlevi yazarsınız:

 Array.prototype.remove = Array.prototype.remove || function(x) { const i = this.indexOf(x); if(i===-1) return; this.splice(i, 1); //num.remove(5) === [1, 2, 3]; } 

Peki ya aşağıda bir dizi varsa ve dizi içinde birkaç [5] varsa?

 var num = [5, 6, 5, 4, 5, 1, 5]; 

Hepsini kontrol etmek için bir döngüye ihtiyacımız var, ancak yerleşik JavaScript işlevlerini kullanmak daha kolay ve daha verimlidir; bu nedenle, aşağıda gösterildiği gibi bir süzgeç kullanan bir işlev yazıyoruz:

 const _removeValue = (arr, x) => arr.filter(n => n!==x); //_removeValue([1, 2, 3, 4, 5, 5, 6, 5], 5) //return [1, 2, 3, 4, 6] 

Ayrıca, Lodash veya Undercore gibi, Lodash _.pull, _.pullAt veya _.without hakkında daha fazla bilgi için, bunu yapmanıza yardımcı olacak üçüncü taraf kütüphaneleri de bulunmaktadır.

32
10 мая '17 в 12:39 2017-05-10 12:39 Cevap Alireza tarafından 10 Mayıs 17 'da 12:39 2017-05-10 12:39 tarihinde verilir.

Javascript konusunda yeniyim ve bu özelliğe ihtiyacım var. Bunu daha yeni yazdım:

 function removeFromArray(array, item, index) { while((index = array.indexOf(item)) > -1) { array.splice(index, 1); } } 

Sonra kullanmak istediğimde:

 //Set-up some dummy data var dummyObj = {name:"meow"}; var dummyArray = [dummyObj, "item1", "item1", "item2"]; //Remove the dummy data removeFromArray(dummyArray, dummyObj); removeFromArray(dummyArray, "item2"); 

Çıkış - beklendiği gibi. ["item1", "item1"]

Benden farklı ihtiyaçlarınız olabilir, bu yüzden onları kolayca uyacak şekilde değiştirebilirsiniz. Umarım bu birine yardımcı olur.

27
16 янв. Cevap sofiax tarafından verildi 16 Ocak 2014-01-16 14:27 '14, 14:27 2014-01-16 14:27

ES6 ve mutasyon olmadan: (Ekim 2016)

 const removeByIndex = (list, index) => [ ...list.slice(0, index), ...list.slice(index + 1) ]; 

Sonra:

 removeByIndex([33,22,11,44],1) //=> [33,11,44] 
24
07 окт. Cevap Abdennour TOUMI Eki 07 2016-10-07 22:42 '16, 10:42, 2016-10-07 22:42

Güncelleme: Bu yöntem yalnızca ECMAScript 2015'i (daha önce ES6 olarak bilinir) kullanamıyorsanız önerilir. Kullanabiliyorsanız, buradaki diğer cevaplar birçok gelişmiş uygulama sunar.


Buradaki anlam , sadece 1 (veya belirtilen değer) değil, argümanın tüm tekrarlarını ortadan kaldırmanın yanı sıra probleminizi çözecektir.

 Array.prototype.destroy = function(obj){ // Return null if no objects were found and removed var destroyed = null; for(var i = 0; i < this.length; i++){ // Use while-loop to find adjacent equal objects while(this[i] === obj){ // Remove this[i] and store it within destroyed destroyed = this.splice(i, 1)[0]; } } return destroyed; } 

Uygulama:

 var x = [1, 2, 3, 3, true, false, undefined, false]; x.destroy(3); // => 3 x.destroy(false); // => false x; // => [1, 2, true, undefined] x.destroy(true); // => true x.destroy(undefined); // => undefined x; // => [1, 2] x.destroy(3); // => null x; // => [1, 2] 
21
13 марта '13 в 12:28 2013-03-13 12:28 Cevap 13 Mart '13'te zykadelic'e veriliyor , 12:28 2013-03-13 12:28

Dizide karmaşık nesneler varsa, filtreleri kullanabilir misiniz? $ .İnArray veya array.splice'in kullanımı kolay değildir. Özellikle dizideki nesneler muhtemelen küçükse.

örneğin Id alanına sahip bir nesneniz varsa ve nesnenin diziden kaldırılmasını istiyorsanız:

 this.array = this.array.filter(function(element, i) { return element.id !== idToRemove; }); 
20
09 апр. Cevap 09 Nisan 09 2015-04-09 13:00 '15 13:00 2015-04-09 13:00

Javascript kullanarak bir elemanı bir diziden kaldırmanın bazı yolları.

Açıklanan tüm yöntemler orijinal diziyi değiştirmez ve bunun yerine yenisini yaratır.

Maddenin indeksini biliyorsanız

Bir diziniz olduğunu ve i konumundaki bir öğeyi silmek istediğinizi varsayalım.

Bir yol, slice() kullanmaktır:

 const items = ['a', 'b', 'c', 'd', 'e', 'f'] const valueToRemove = 'c' const filteredItems = items.filter(item => item !== valueToRemove) console.log(filteredItems) 

ES6 oklarının işlevlerini kullanır. Eski tarayıcıları desteklemek için geleneksel özellikleri kullanabilirsiniz:

 const items = ['a', 'b', 'c', 'd', 'e', 'f'] const removeItem = (items, i) => items.slice(0, i-1).concat(items.slice(i, items.length)) let filteredItems = removeItem(items, 3) filteredItems = removeItem(filteredItems, 5) //["a", "b", "c", "d"] console.log(filteredItems) 

Değere göre

Geri arama işlevinin içine dahil etmek için arama yapabilirsiniz:

20
04 мая '18 в 8:17 2018-05-04 08:17 Cevap Flavio Copes tarafından 04 Mayıs 18'de , 08:17 de 08:17

Bir dizi dizisini asla değiştirmemelisiniz. Çünkü fonksiyonel programlama modeliyle çelişiyor. Yapabileceğiniz şey, ES6 filter yöntemini kullanarak verileri değiştirmek istediğiniz diziye başvuru yapmadan yeni bir dizi oluşturmak;

 var myArray = [1,2,3,4,5,6]; 

Bir diziden 5 kaldırmak istediğinizi varsayalım, bunu böyle yapabilirsiniz.

 myArray = myArray.filter(value => value !== 5); 

Bu size silmek istediğiniz değeri olmayan yeni bir dizi verecektir. Yani sonuç olacak

  [1,2,3,4,6]; // 5 has been removed from this array 

Daha fazla bilgi için, MDR belgelerini Array.filter https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter adresinden okuyabilirsiniz.

19
26 дек. Cevap 26 Aralık Adeel Imran tarafından verilen cevap 2017-12-26 22:32 '17, 10:32, 2017-12-26 22:32

Daha modern, ECMAScript 2015 (daha önce Harmony veya ES 6 olarak bilinen). verilen:

 const items = [1, 2, 3, 4]; const index = 2; 

Sonra:

 items.filter((x, i) => i !== index); 

imtiyaz:

 [1, 2, 4] 

Babel ve polyfill servisini tarayıcıların iyi olması için kullanabilirsiniz.

18
25 апр. Cevap bjfletcher 25 nisan . 2016-04-25 13:21 '16, 13:21, 2016-04-25 13:21

Zaten birçok cevap olduğunu biliyorum, ancak birçoğu sorunu karmaşıklaştırıyor gibi görünüyor. İşte bir anahtarın tüm örneklerini kaldırmanın basit, özyinelemeli bir yolu - bir dizin bulunana kadar kendini çağırır. Evet, yalnızca indexOf olan tarayıcılarda çalışır, ancak basittir ve kolayca doldurulabilir.

Özerk fonksiyon

 function removeAll(array, key){ var index = array.indexOf(key); if(index === -1) return; array.splice(index, 1); removeAll(array,key); } 

Prototip yöntemi

 Array.prototype.removeAll = function(key){ var index = this.indexOf(key); if(index === -1) return; this.splice(index, 1); this.removeAll(key); } 
16
03 февр. Cevap wharding28 03 Şub. 2014-02-03 18:41 '14, 18:41 2014-02-03 18:41

Bir diziden kaldırmak için başka iyi bir çözüm var:

 var words = ['spray', 'limit', 'elite', 'exuberant', 'destruction', 'present']; const result = words.filter(word => word.length > 6); console.log(result); // expected output: Array ["exuberant", "destruction", "present"] 

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter

15
05 июня '18 в 17:47 2018-06-05 17:47 Aram Grigoryan'a 05 Haziran 18 : 17'de, 19:47 de 2018-06-05 17:47

Öğenin birden fazla örneği varsa, dizinleri aşağı çevirmediğinizden emin olmak için bir ters döngü yapabilirsiniz.

 var myElement = "chocolate"; var myArray = ['chocolate', 'poptart', 'poptart', 'poptart', 'chocolate', 'poptart', 'poptart', 'chocolate'];  for (var i = myArray.length - 1; i >= 0; i--) { if (myArray[i] == myElement) myArray.splice(i, 1); } 

Canlı demo

15
12 авг. Cevap Jeff Noel 12 Ağustos tarafından verilmiştir . 2013-08-12 20:56 '13, 20:56 2013-08-12 20:56

Çoğunlukla doğru olan tüm cevaplara dayanarak ve en iyi önerileri dikkate alarak (özellikle doğrudan Array.prototype kullanmadan) aşağıdaki koda geldim:

 function arrayWithout(arr, values) { var isArray = function(canBeArray) { if (Array.isArray) { return Array.isArray(canBeArray); } return Object.prototype.toString.call(canBeArray) === '[object Array]'; }; var excludedValues = (isArray(values)) ? values : [].slice.call(arguments, 1); var arrCopy = arr.slice(0); for (var i = arrCopy.length - 1; i >= 0; i--) { if (excludedValues.indexOf(arrCopy[i]) > -1) { arrCopy.splice(i, 1); } } return arrCopy; } 

Yukarıdaki işlevi inceleyerek, iyi çalışmasına rağmen, performans artışı olabileceğini fark ettim. Также использование ES6 вместо ES5 является гораздо лучшим подходом. Для этого это улучшенный код:

 const arrayWithoutFastest = (() => { const isArray = canBeArray => ('isArray' in Array) ? Array.isArray(canBeArray) : Object.prototype.toString.call(canBeArray) === '[object Array]'; let mapIncludes = (map, key) => map.has(key); let objectIncludes = (obj, key) => key in obj; let includes; function arrayWithoutFastest(arr, ...thisArgs) { let withoutValues = isArray(thisArgs[0]) ? thisArgs[0] : thisArgs; if (typeof Map !== 'undefined') { withoutValues = withoutValues.reduce((map, value) => map.set(value, value), new Map()); includes = mapIncludes; } else { withoutValues = withoutValues.reduce((map, value) => { map[value] = value; return map; } , {}); includes = objectIncludes; } const arrCopy = []; const length = arr.length; for (let i = 0; i < length; i++) { // If value is not in exclude list if (!includes(withoutValues, arr[i])) { arrCopy.push(arr[i]); } } return arrCopy; } return arrayWithoutFastest; })();