Kako ukloniti određeni element iz niza u javascript?

Imam niz prirodnih brojeva i koristim .push() za dodavanje elemenata u nju.

Postoji li jednostavan način za uklanjanje određene stavke iz niza? Ekvivalent nešto poput array.remove(int); ,

Moram koristiti osnovni javascript - nema dopuštenih okvira.

6774
24 апр. postavila Walker 24. travnja 2011-04-24 01:17 '11 u 1:17 2011-04-24 01:17
@ 78 odgovora
  • 1
  • 2
  • 3

Pronađite index elementa niza koji želite ukloniti, a zatim ga izbrišite pomoću splice .

Metoda splice () mijenja sadržaj niza brisanjem postojećih elemenata i / ili dodavanjem novih elemenata.

podrška preglednika za indexOf je ograničena;  Internet Explorer 7 i 8 to ne podržava. 

Ako vam je potreban indexOf u nepodržanom pregledniku, isprobajte polyfill sljedeći polyfill . Više informacija o ovom polyfill možete polyfill ovdje .

 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 апр. Odgovor je dao Tom Wadley 24. travnja 2011-04-24 01:23 '11 u 1:23 2011-04-24 01:23

Ne znam kako ćete očekivati ​​da će se array.remove(int) ponašati. Postoje tri mogućnosti o kojima možete razmišljati.

Da biste uklonili element niza s indeksom i :

 array.splice(i, 1); 

Ako želite ukloniti svaku stavku s number vrijednosti iz niza:

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

Ako samo želite napraviti element s indeksom, i više ne postoji, ali ne želite da se indeksi drugih elemenata promijene:

 delete array[i]; 
990
24 апр. Odgovor dao Peter Olson 24. travnja 2011-04-24 01:20 '11 u 1:20 2011-04-24 01:20

Uređeno 2016. u listopadu

  • Učinite ga jednostavnim, intuitivnim i eksplicitnim ( https://en.wikipedia.org/wiki/Occam%27s_razor )
  • Neka ostane nepromijenjena (izvorni niz ostaje nepromijenjen)
  • Učinite to sa standardnim JS funkcijama, ako ih vaš preglednik ne podržava - koristite polyfill

U ovom primjeru koda koristim funkciju array.filter (...) za uklanjanje neželjenih elemenata iz niza, ova funkcija ne mijenja izvorni niz i stvara novi.Ako vaš preglednik ne podržava tu funkciju (na primjer, IE do verzije 9 ili Firefox prije verzije 1.5), razmislite o korištenju Mozilla polyfill filtra .

Brisanje stavke (kôd ECMA-262 izdanja 5 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 ] 

Brisanje stavke (ES2015 kôd)

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

VAŽNA ES2015 "() => {}" sintaksa funkcije strelica nije podržana u IE općenito, Chrome do verzije 45, Firefox do verzije 22, Safari do verzije 10. Da biste koristili ES2015 sintaksu u starijim preglednicima, možete koristiti BabelJS


Brisanje više stavki (kôd ES2016)

Dodatna prednost ove metode je što možete izbrisati nekoliko stavki.

 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 ] 

VAŽNO "array.includes (...)" uopće nije podržano u IE-u, Chrome do verzije 47, Firefox do verzije 43, Safari do verzije 9 i Edge do verzije 14, pa evo Mozilla poli-polja

Ukloni više elemenata (napredni eksperimentalni 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 (stavka =>! ForDeletion.includes (item))} neka arr = [1, 2, 3, 4, 5, 3] // :: Prijedlog sintakse ovog povezivanja // pomoću funkcije uklanjanja kao "virtualne metode" arr = arr :: remove (2, 3, 5) console.log (arr) // [1, 4] rel = noreferrer> Probajte ga sami u BabelJS: )

informacije

814
19 дек. Odgovor je dao Ujeenator 19. prosinca 2013-12-19 22:54 '13 u 22:54 2013-12-19 22:54

Ovisno o tome želite li uštedjeti prazan prostor ili ne.

Ako vam je potrebno prazno mjesto, uklanjanje će biti u redu:

 delete array[ index ]; 

Ako to ne učinite, upotrijebite metodu splice :

 array.splice( index, 1 ); 

Ako vam je potrebna vrijednost ovog elementa, jednostavno možete spremiti element vraćenog polja:

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

Ako želite to učiniti u određenom redoslijedu, možete koristiti array.pop() za potonje ili array.shift() za prvi (i oba vraćaju vrijednost elementa).

A ako ne znate indeks stavke, možete koristiti array.indexOf( item ) da biste ga dobili (u if() da biste dobili jednu stavku ili u while() da biste dobili sve njih). array.indexOf( item ) vraća indeks ili -1 ako nije pronađen.

381
24 апр. odgovor dat xavierm02 24. tra 2011-04-24 01:32 '11 u 1:32 2011-04-24 01:32

Prijatelj je imao problema s preglednikom Internet Explorer 8 i pokazao mi je što je učinio. Rekao sam mu da je to pogrešno i rekao mi je da je ovdje dobio odgovor. Trenutni odgovor neće raditi u svim preglednicima (na primjer, Internet Explorer 8), a uklonit će samo prvu pojavu stavke.

Uklonite SVE instance iz niza

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

Pomiče se unatrag kroz niz (budući da se indeksi i duljina mijenjaju kao elementi uklonjeni) i briše element ako se pronađe. Radi u svim preglednicima.

249
10 авг. Odgovor dao Ben Lesh 10. kolovoza 2013-08-10 22:21 '13 u 22:21 sati 2013-08-10 22:21

Postoje dva glavna pristupa:

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

  • delete : delete anArray[index];

Budite oprezni kada koristite za brisanje polja. To je dobro za uklanjanje atributa objekata, ali ne tako dobro za polja. Bolje je koristiti splice za nizove.

Imajte na umu da kada koristite za delete polja, možete dobiti netočne rezultate za anArray.length . Drugim riječima, delete briše element, ali ne ažurira vrijednost svojstva duljine.

Možete također očekivati ​​rupe u indeksnim brojevima nakon uporabe brisanja, na primjer. mogli biste dobiti indekse od 1,3,4,8,9,11 i duljine, kao što je bilo prije korištenja brisanja. U tom će slučaju sve indeksirane for petlje biti podijeljene, budući da indeksi više nisu dosljedni.

Ako iz nekog razloga morate koristiti delete , onda morate koristiti for each petlju kada trebate iterirati kroz nizove. Zapravo, uvijek izbjegavajte korištenje indeksiranih za petlje, ako je moguće. Dakle, kod će biti pouzdaniji i manje skloni problemima s indeksima.

140
21 дек. odgovor je dan Saša 21 dec. 2012-12-21 14:32 '12 u 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 апр. odgovor je dat Zirak 24 travnja. 2011-04-24 01:20 '11 u 1:20 2011-04-24 01:20

Nema potrebe koristiti indexOf ili splice . No, to radi bolje ako želite ukloniti samo jednu pojavu stavke.

Pronađite i premjestite:

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

Upotrijebi indexOf i splice (indexof):

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

Koristite samo splice :

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

Vrijeme isporuke za nodejs za niz s 1000 elemenata (prosječno više od 10.000 pokretanja):

Indeks je oko 10 puta sporiji od kretanja. Čak i ako se poboljša uklanjanjem poziva indexOf u indexOf , on radi mnogo gore nego se kreće.

 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 сент. Odgovor je dat slosd 19. rujna 2013-09-19 04:53 '13 u 4:53 2013-09-19 04:53

Najlakši način:

 var index = array.indexOf(item); if(index != -1) array.splice( index, 1 ); 
81
02 дек. Odgovor daje Nanego 02. prosinca. 2017-12-02 20:42 '17 u 20:42 2017-12-02 20:42

Previše je staro za odgovor, ali može li nekome pomoći ako predloži predikat umjesto vrijednosti.

NAPOMENA: ažurirat će ovaj niz i vratiti pogođene linije.

Upotreba

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

definicija

 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 odgovor je dat amd 2. svibanj '14 u 15:00 2014-05-02 15:00

John Resig objavio je dobru implementaciju :

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

Ako ne želite proširiti globalni objekt, možete učiniti nešto poput sljedećeg:

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

Ali glavni razlog zbog kojeg to objavljujem jest upozoriti korisnike na alternativnu implementaciju predloženu u komentarima na ovoj stranici (14. prosinca 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; }; 

Čini se da isprva dobro funkcionira, ali kroz bolan proces otkrio sam da ne radi, pokušavajući ukloniti drugi na posljednji element u nizu. Na primjer, ako imate niz od 10 elemenata i pokušavate ukloniti deveti element s ovim:

 myArray.remove(8); 

Kao rezultat, dobivate niz od 8 elemenata. Ne znam zašto, ali sam potvrdio da izvorna implementacija Johna nema ovaj problem.

55
30 авг. odgovor je dat Roger 30 aug. 2013-08-30 22:07 '13 u 22:07 2013-08-30 22:07

Underscore.js se može koristiti za rješavanje problema s više preglednika. Ona koristi ugrađene metode preglednika, ako ih ima. Ako nedostaju, kao što je slučaj sa starijim verzijama programa Internet Explorer, koristi vlastite metode.

Jednostavan primjer za uklanjanje elemenata iz niza (s web-lokacije):

 _.without([1, 2, 1, 0, 3, 1, 4], 0, 1); // => [2, 3, 4] 
53
30 мая '14 в 12:57 2014-05-30 12:57 odgovor je dao vatsal 30. svibnja 2014. u 12:57 2014-05-30 12:57

To možete jednostavno učiniti pomoću metode filtriranja :

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

Ovo uklanja sve elemente iz niza, a također radi brže od kombinacije kriška i indeksa.

52
11 февр. Odgovor je dao Salvador Dali 11. veljače. 2014-02-11 01:06 '14 u 1:06 2014-02-11 01:06

Ako želite izbrisati novi niz s izbrisanim pozicijama, uvijek možete izbrisati određeni element i filtrirati polje. Možda ćete morati proširiti objekt niza za preglednike koji ne primjenjuju metodu filtra, ali dugoročno je lakše, jer sve što radite je sljedeće:

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

Mora se prikazati [1, 2, 3, 4, 6]

40
18 окт. Odgovori Loupax 18. listopada 2012-10-18 13:13 '12 u 13:13 2012-10-18 13:13

Možete koristiti ES6.

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

izlaz:

 ["1", "2", "4", "5", "6"] 
37
04 окт. odgovor je dan rajat44 04 okt. 2016-10-04 11:07 '16 u 11:07 2016-10-04 11:07

Pogledajte ovaj kôd. Radi u svakom većem pregledniku. ,

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

Nazovite tu funkciju

 remove_item(array,value); 
34
02 апр. Odgovor daje Ekramul Hoque 02. travnja. 2013-04-02 13:56 '13 u 13:56 2013-04-02 13:56

Možete koristiti lodash _. pull (mutate array), _.pullAt (matrica mutacije) ili _. bez (ne mutira polje),

 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 авг. odgovor je dan Chun Yang 25 aug. 2015-08-25 22:34 '15 u 22:34 2015-08-25 22:34

U redu, na primjer, ispod imate niz:

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

Želimo izbrisati broj 4, možete napraviti sljedeći kôd:

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

Ako ponovno koristite ovu funkciju, napišete funkciju ponovnog korištenja koja će biti vezana za funkciju Native array, kao što je prikazano u nastavku:

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

Ali kako bi bilo da imate niz ispod i nekoliko [5] u nizu?

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

Potrebna nam je petlja da ih sve provjerimo, ali je lakše i učinkovitije koristiti ugrađene JavaScript funkcije, tako da pišemo funkciju koja koristi filtar, kao što je prikazano u nastavku:

 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] 

Tu su i knjižnice trećih strana koje će vam pomoći u tome, kao što su Lodash ili Underscore, za više informacija o lodash _.pull, _.pullAt ili _.without.

32
10 мая '17 в 12:39 2017-05-10 12:39 Odgovor daje Alireza 10. svibnja 2006. u 12:39 2017-05-10 12:39

Ja sam novi u javascriptu i potrebna mi je ova značajka. Upravo sam napisao ovo:

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

Zatim, kada ga želim koristiti:

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

Izlaz - kako se i očekivalo. ["item1", "item1"]

Vi svibanj imati različite potrebe od mene, tako da možete lako ih promijeniti da stane njima. Nadam se da ovo pomaže nekome.

27
16 янв. odgovor je dao sofiax 16. siječnja 2014-01-16 14:27 '14 u 14:27 2014-01-16 14:27

ES6 i bez mutacije: (listopad 2016.)

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

zatim:

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

Ažuriranje: Ova metoda se preporučuje samo ako ne možete koristiti ECMAScript 2015 (prethodno poznat kao ES6). Ako ga možete koristiti, drugi odgovori ovdje daju mnogo naprednih implementacija.


Ovo značenje ovdje će riješiti vaš problem, kao i ukloniti sve pojave argumenta, a ne samo 1 (ili specificiranu vrijednost).

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

primjena:

 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 odgovor je dat zykadelic 13. ožujka '13 u 12:28 2013-03-13 12:28

Ako imate složene objekte u nizu, možete li koristiti filtre? U situacijama kada $ .inArray ili array.splice nije jednostavan za korištenje. Pogotovo ako su objekti možda mali u nizu.

na primjer. ako imate objekt s poljem Id i želite da se objekt ukloni iz niza:

 this.array = this.array.filter(function(element, i) { return element.id !== idToRemove; }); 
20
09 апр. odgovor je dat flurdy 09 apr. 2015-04-09 13:00 '15 u 13:00 sati 2015-04-09 13:00

Evo nekoliko načina za uklanjanje elementa iz niza pomoću javascripta .

Sve opisane metode ne mijenjaju izvorni niz i umjesto toga stvaraju novi.

Ako znate indeks stavke

Pretpostavimo da imate niz i želite izbrisati element na poziciji i .

Jedan od načina je korištenje slice() :

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

Ona koristi funkcije strelica ES6. Možete koristiti tradicionalne značajke za podršku starijim preglednicima:

 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) 

Po vrijednosti

Možete pretraživati ​​za uključivanje unutar funkcije povratnog poziva:

https://flaviocopes.com/how-to-remove-item-from-array/ ) 

20
04 мая '18 в 8:17 2018-05-04 08:17 Odgovor je dao Flavio Copes 04. svibnja 2010. u 8:17 sati 2018-05-04 08:17

Nikada nemojte mutirati niz polja. Zato što je u suprotnosti s funkcionalnim obrascem programiranja. Ono što možete učiniti je stvoriti novi niz bez reference na polje koje želite modificirati pomoću metode ES6 filter ;

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

Pretpostavimo da želite ukloniti 5 iz niza, možete to učiniti samo ovako.

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

Time ćete dobiti novi niz bez vrijednosti koju želite izbrisati. Rezultat će biti

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

Za daljnje razumijevanje, možete pročitati MDN dokumentaciju na Array.filter https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter

19
26 дек. Odgovor Adeel Imran Dec 26 2017-12-26 22:32 '17 u 22:32 2017-12-26 22:32

Modernije, ECMAScript 2015 (ranije poznat kao Harmony ili ES 6). dati:

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

zatim:

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

koncesija:

 [1, 2, 4] 

Možete koristiti Babel i polyfill uslugu kako bi preglednici bili dobri.

18
25 апр. odgovor daje bjfletcher 25. travnja. 2016-04-25 13:21 '16 u 13:21 2016-04-25 13:21

Znam da već postoji mnogo odgovora, ali čini se da mnogi od njih kompliciraju problem. Evo jednostavnog, rekurzivnog načina uklanjanja svih instanci ključa - on poziva sebe dok se indeks ne pronađe. Da, radi samo u preglednicima s indexOf , ali je jednostavno i lako se može popuniti.

Autonomna funkcija

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

Metoda prototipa

 Array.prototype.removeAll = function(key){ var index = this.indexOf(key); if(index === -1) return; this.splice(index, 1); this.removeAll(key); } 
16
03 февр. Odgovor je dan 28 03 Feb. 2014-02-03 18:41 '14 u 18:41 2014-02-03 18:41

Imam još jedno dobro rješenje za uklanjanje iz niza:

 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 odgovorio je Aramu Grigoryanu 05. lipnja 18 u 17:47 sati 2018-06-05 17:47

Možete napraviti obrnutu petlju kako biste bili sigurni da ne zajebavate indekse ako postoji više primjeraka elementa.

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

Demo uživo

15
12 авг. odgovor je dao Jeff Noel 12 aug. 2013-08-12 20:56 '13 u 20:56 2013-08-12 20:56

Na temelju svih odgovora koji su uglavnom bili točni i uzimajući u obzir najbolje preporuke (posebno bez izravnog korištenja Array.prototype), došao sam do sljedećeg koda:

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

Analizirajući gore navedenu funkciju, unatoč činjenici da dobro radi, shvatio sam da bi moglo doći do poboljšanja performansi. Također, korištenje ES6 umjesto ES5 je puno bolji pristup. Da biste to učinili, ovo je poboljšani kôd:

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