Як видалити певний елемент з масиву в JavaScript?

У мене є масив цілих чисел, і я використовую метод .push() для додавання в нього елементів.

Чи є простий спосіб видалити певний елемент з масиву? Еквівалент чогось типу array.remove(int); .

Мені потрібно використовувати базовий JavaScript - ніяких фреймворків заборонено.

6774
24 апр. заданий Walker 24 Квітня. 2011-04-24 01:17 '11 в 1:17 2011-04-24 1:17
@ 78 відповідей
  • 1
  • 2
  • 3

Знайдіть index елемента масиву, який ви хочете видалити, потім видаліть цей індекс за допомогою splice .

Метод splice () змінює вміст масиву шляхом видалення існуючих елементів і / або додавання нових елементів.

підтримка браузера для indexOf обмежена;  він не підтримується в Internet Explorer 7 і 8. 

Якщо вам потрібен indexOf в підтримуваному браузері, спробуйте polyfill наступний polyfill . Знайти більш детальну інформацію про це polyfill тут .

 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 апр. відповідь дан Tom Wadley 24 Квітня. 2011-04-24 01:23 '11 в 1:23 2011-04-24 1:23

Я не знаю, як ви очікуєте, що array.remove(int) буде себе вести. Є три можливості, про які ви можете подумати.

Щоб видалити елемент масиву з індексом i :

 array.splice(i, 1); 

Якщо ви хочете видалити кожен елемент з number значення з масиву:

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

Якщо ви просто хочете зробити елемент з індексом, i більше не існує, але ви не хочете, щоб індекси інших елементів змінилися:

 delete array[i]; 
990
24 апр. відповідь дан Peter Olson 24 Квітня. 2011-04-24 01:20 '11 о 1:20 2011-04-24 1:20

Змінено 2016 Жовтень

  • Зробіть це простим, інтуїтивним і явним ( https://en.wikipedia.org/wiki/Occam%27s_razor )
  • Зробіть це незмінним (вихідний масив залишиться без змін)
  • Зробіть це зі стандартними функціями JS, якщо ваш браузер їх не підтримує - використовуйте polyfill

У цьому прикладі коду я використовую функцію array.filter (...) "для видалення непотрібних елементів з масиву, ця функція не змінює вихідний масив і створює новий. Якщо ваш браузер не підтримує цю функцію (наприклад, IE до версії 9 або Firefox до версії 1.5), подумайте про використання фільтра polyfill з Mozilla .

Видалення елемента (ECMA-262 Edition 5 code 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 ] 

Видалення елемента (код ES2015)

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

ВАЖЛИВО ES2015 "() => {}" синтаксис функції стрілки не підтримується в IE взагалі, Chrome до версії 45, Firefox до версії 22, Safari до 10 версії. Щоб використовувати синтаксис ES2015 в старих браузерах, ви можете використовувати BabelJS


Видалення кількох елементів (код ES2016)

Додатковою перевагою цього методу є те, що ви можете видалити кілька елементів

 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 ] 

ВАЖЛИВО "array.includes (...)» не підтримується в IE взагалі, Chrome до версії 47, Firefox до версії 43, Safari до версії 9 і Edge до 14 версії, так що ось Поліполія від Mozilla

Видалення кількох елементів (передовий експериментальний 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] // :: This-Binding Syntax Proposal // using remove function as "virtual method" arr = arr :: remove (2, 3, 5) console.log (arr) // [1, 4] rel = noreferrer> Спробуйте самі в BabelJS: )

Довідка

814
19 дек. відповідь дан Ujeenator 19 дек. 2013-12-19 22:54 '13 о 22:54 2013-12-19 22:54

Залежно від того, чи хочете ви зберегти пусте місце чи ні.

Якщо вам потрібен порожній слот, видалення буде прекрасним:

 delete array[ index ]; 

Якщо ви цього не зробите, ви повинні використовувати метод splice :

 array.splice( index, 1 ); 

І якщо вам потрібно значення цього елемента, ви можете просто зберегти повертається елемент масиву:

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

Якщо ви хочете зробити це в певному порядку, ви можете використовувати array.pop() для останнього або array.shift() для першого (і обидва повертають значення елемента теж).

І якщо ви не знаєте індекс елемента, ви можете використовувати array.indexOf( item ) , щоб отримати його (в if() , щоб отримати один елемент або в while() , щоб отримати всі з них). array.indexOf( item ) повертає або індекс, або -1, якщо не знайдений.

381
24 апр. відповідь дан xavierm02 24 Квітня. 2011-04-24 01:32 '11 в 1:32 2011-04-24 1:32

У друга виникли проблеми в Internet Explorer 8 , і він показав мені, що він зробив. Я сказав йому, що це неправильно, і він сказав мені, що отримав відповідь тут. Поточний верхній відповідь не буде працювати у всіх браузерах (наприклад, Internet Explorer 8), і він видалить тільки перше входження елемента.

Видалити ВСІ екземпляри з масиву

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

Він переміщається по масиву назад (оскільки індекси і довжина будуть змінюватися в міру віддалення елементів) і видаляє елемент, якщо він знайдений. Він працює у всіх браузерах.

249
10 авг. відповідь дан Ben Lesh 10 Серпня. 2013-08-10 22:21 '13 о 22:21 2013-08-10 22:21

Існує два основні підходи:

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

  • видалити: delete anArray[index];

Будьте обережні, коли ви використовуєте delete для масиву. Він хороший для видалення атрибутів об'єктів, але не такий гарний для масивів. Краще використовувати splice для масивів.

Майте на увазі, що коли ви використовуєте delete для масиву, ви можете отримати неправильні результати для anArray.length . Іншими словами, delete видалить елемент, але не оновить значення властивості length.

Ви також можете очікувати наявності отворів в індексних номерах після використання видалення, наприклад. ви могли б отримати індекси 1,3,4,8,9,11 і довжину, як це було до використання видалення. В цьому випадку всі індексовані цикли for будуть розбиватися, оскільки індекси перестають бути послідовними.

Якщо ви з якоїсь причини змушені використовувати delete , тоді вам потрібно використовувати петлі for each , коли вам потрібно перебирати масиви. По суті справи, завжди уникайте використання індексованих для петель, якщо це можливо. Таким чином, код буде більш надійним і менш схильним до проблем з індексами.

140
21 дек. відповідь дан Sasa 21 дек. 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 апр. відповідь дан Zirak 24 Квітня. 2011-04-24 01:20 '11 о 1:20 2011-04-24 1:20

Немає необхідності використовувати indexOf або splice . Однак він працює краще, якщо ви хочете видалити тільки одне входження елемента.

Знайти і перемістити (перемістити):

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

Використовуйте indexOf і splice (indexof):

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

Використовувати тільки splice (зрощення):

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

Час виконання для nodejs для масиву від 1000 елементами (в середньому понад 10000 прогонів):

indexof приблизно в 10 разів повільніше, ніж переміщення. Навіть якщо це покращився, видаливши виклик indexOf в зрощуванні, він виконує набагато гірше, ніж переміщення.

 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 сент. відповідь дан slosd 19 сент. 2013-09-19 04:53 '13 в 4:53 2013-09-19 4:53

Найпростіший спосіб:

 var index = array.indexOf(item); if(index != -1) array.splice( index, 1 ); 
81
02 дек. відповідь дан Nanego 02 дек. 2017-12-02 20:42 '17 о 20:42 2017-12-02 20:42

Занадто старий, щоб відповісти, але чи може він допомогти комусь, надавши предикат замість значення.

ПРИМІТКА: він оновить даний масив і поверне порушені рядки

Використання

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

визначення

 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 відповідь дан amd 02 травня '14 о 15:00 2014-05-02 15:00

John Resig опублікував хорошу реалізацію :

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

Якщо ви не хочете розширювати глобальний об'єкт, ви можете зробити щось на кшталт такого:

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

Але основна причина, по якій я публікую це, - попередити користувачів про альтернативну реалізації, запропонованої в коментарях до цієї сторінки (14 грудня 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; }; 

Здається, що спочатку добре працює, але через болісний процес я виявив, що він не працює, намагаючись видалити другий в останній елемент в масиві. Наприклад, якщо у вас є 10-елементний масив, і ви намагаєтеся видалити 9-й елемент за допомогою цього:

 myArray.remove(8); 

У підсумку ви отримаєте 8-елементний масив. Не знаю, чому, але я підтвердив, що первісна реалізація John не має цієї проблеми.

55
30 авг. відповідь дан Roger 30 Серпня. 2013-08-30 22:07 '13 о 22:07 2013-08-30 22:07

Underscore.js можна використовувати для вирішення проблем з декількома браузерами. Він використовує вбудовані методи браузера, якщо вони є. Якщо вони відсутні, як у випадку з попередніми версіями Internet Explorer, він використовує свої власні методи.

Простий приклад для видалення елементів з масиву (з веб-сайту):

 _.without([1, 2, 1, 0, 3, 1, 4], 0, 1); // => [2, 3, 4] 
53
30 мая '14 в 12:57 2014-05-30 12:57 відповідь дан vatsal 30 травня '14 о 12:57 2014-05-30 12:57

Ви можете зробити це легко за допомогою методу filter :

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

Це видаляє всі елементи з масиву, а також працює швидше, ніж комбінація зрізу і indexOf

52
11 февр. відповідь дан Salvador Dali 11 февр. 2014-02-11 01:06 '14 в 1:06 2014-02-11 1:06

Якщо ви хочете видалити новий масив з віддаленими позиціями, ви завжди можете видалити певний елемент і відфільтрувати масив. Може знадобитися розширення об'єкта масиву для браузерів, які не реалізують метод фільтра, але в довгостроковій перспективі це простіше, оскільки все, що ви робите, це наступне:

 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 окт. відповідь дан Loupax 18 Жовтня. 2012-10-18 13:13 '12 о 13:13 2012-10-18 13:13

Ви можете використовувати ES6.

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

вихід:

 ["1", "2", "4", "5", "6"] 
37
04 окт. відповідь дан rajat44 04 Жовтня. 2016-10-04 11:07 '16 об 11:07 2016-10-04 11:07

Перевірте цей код. Він працює в кожному головному браузері .

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

Виклик цієї функції

 remove_item(array,value); 
34
02 апр. відповідь дан Ekramul Hoque 02 Квітня. 2013-04-02 13:56 '13 о 13:56 2013-04-02 13:56

Ви можете використовувати lodash _. pull (mutate array), _.pullAt (мутувати масив) або _. без (НЕ мутує масив),

 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 авг. відповідь дан Chun Yang 25 Серпня. 2015-08-25 22:34 '15 о 22:34 2015-08-25 22:34

ОК, наприклад, у вас є масив нижче:

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

І ми хочемо видалити номер 4, ви можете просто зробити наступний код:

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

Якщо ви повторно використовуєте цю функцію, ви пишете функцію повторного використання, яка буде прив'язана до функції Native array, як показано нижче:

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

Але як щодо того, якщо у вас є масив нижче, а кілька [5] s в масиві?

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

Нам потрібен цикл, щоб перевірити їх все, але простіше і ефективніше використовувати вбудовані функції JavaScript, тому ми пишемо функцію, яка використовує фільтр, як показано нижче:

 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] 

Також є бібліотеки сторонніх розробників, які допоможуть вам зробити це, наприклад Lodash або Underscore, для отримання додаткової інформації про lodash _.pull, _.pullAt або _.without.

32
10 мая '17 в 12:39 2017-05-10 12:39 відповідь дан Alireza 10 травня '17 о 12:39 2017-05-10 12:39

Я новачок в JavaScript і потребую цієї функції. Я просто написав це:

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

Потім, коли я хочу використовувати його:

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

Вихід - як і очікувалося. [ "Item1", "item1"]

У вас можуть бути різні потреби, ніж у мене, тому ви можете легко змінити їх відповідно до них. Сподіваюся, це допоможе комусь.

27
16 янв. відповідь дан sofiax 16 Січня. 2014-01-16 14:27 '14 о 14:27 2014-01-16 14:27

ES6 і без мутації: (жовтень 2016 г.)

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

тоді:

 removeByIndex([33,22,11,44],1) //=> [33,11,44] 
24
07 окт. відповідь дан Abdennour TOUMI 07 Жовтня. 2016-10-07 22:42 '16 о 22:42 2016-10-07 22:42

Оновлення: цей метод рекомендується використовувати, тільки якщо ви не можете використовувати ECMAScript 2015 (раніше відомий як ES6). Якщо ви можете використовувати його, інші відповіді тут дають багато випереджальних реалізацій.


Цей сенс тут вирішить вашу проблему, а також видалить всі входження аргументу, а не тільки 1 (або вказане значення).

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

застосування:

 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 відповідь дан zykadelic 13 березня '13 о 12:28 2013-03-13 12:28

Якщо у вас є складні об'єкти в масиві, ви можете використовувати фільтри? У ситуаціях, коли $ .inArray або array.splice не такі прості у використанні. Особливо, якщо об'єкти, можливо, дрібні в масиві.

наприклад. якщо у вас є об'єкт з полем Id і ви хочете, щоб об'єкт був видалений з масиву:

 this.array = this.array.filter(function(element, i) { return element.id !== idToRemove; }); 
20
09 апр. відповідь дан flurdy 09 Квітня. 2015-04-09 13:00 '15 о 13:00 2015-04-09 13:00

Ось кілька способів видалити елемент з масиву за допомогою JavaScript.

Всі описані методи не змінюють вихідний масив і замість цього створюють новий.

Якщо ви знаєте індекс елемента

Припустимо, у вас є масив, і ви хочете видалити елемент в позиції i .

Один із способів - використовувати slice() :

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

Це використовує функції стрілок ES6. Ви можете використовувати традиційні функції для підтримки старих браузерів:

 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) 

за значенням

Ви можете шукати включення всередині функції зворотного виклику:

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

20
04 мая '18 в 8:17 2018-05-04 08:17 відповідь дан Flavio Copes 04 травня '18 о 8:17 2018-05-04 8:17

Ви ніколи не повинні мутувати масив масиву. Оскільки це суперечить функціональному шаблоном програмування. Що ви можете зробити, це створити новий масив без посилання на масив, який ви хочете змінити дані за допомогою методу ES6 filter ;

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

Припустимо, ви хочете видалити 5 з масиву, ви можете просто зробити це так.

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

Це дасть вам новий масив без значення, яке ви хочете видалити. Таким чином, результат буде

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

Для подальшого розуміння ви можете прочитати документацію MDN на Array.filter https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter

19
26 дек. відповідь дан Adeel Imran 26 дек. 2017-12-26 22:32 '17 о 22:32 2017-12-26 22:32

Більш сучасний, ECMAScript 2015 (раніше відомий як Harmony або ES 6). дано:

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

тоді:

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

поступка:

 [1, 2, 4] 

Ви можете використовувати Babel і службу polyfill , щоб це було добре браузери.

18
25 апр. відповідь дан bjfletcher 25 квіт. 2016-04-25 13:21 '16 о 13:21 2016-04-25 13:21

Я знаю, що вже є багато відповідей, але багато хто з них, схоже, ускладнюють проблему. Ось простий, рекурсивний спосіб видалення всіх примірників ключа - викликає self, поки індекс не буде знайдений. Так, він працює тільки в браузерах з indexOf , але він простий і може бути легко заповнений.

Автономна функція

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

метод прототипу

 Array.prototype.removeAll = function(key){ var index = this.indexOf(key); if(index === -1) return; this.splice(index, 1); this.removeAll(key); } 
16
03 февр. відповідь дан wharding28 03 февр. 2014-02-03 18:41 '14 о 18:41 2014-02-03 18:41

У мене є ще одне гарне рішення для видалення з масиву:

 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 05 червня '18 о 17:47 2018-06-05 17:47

Ви можете зробити зворотний цикл, щоб переконатися, що ви не загвинчувати індекси, якщо є кілька примірників елемента.

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

Live Demo

15
12 авг. відповідь дан Jeff Noel 12 Серпня. 2013-08-12 20:56 '13 о 20:56 2013-08-12 20:56

Грунтуючись на всіх відповідях, які були в основному правильними, і з урахуванням кращих рекомендацій (особливо без безпосереднього використання Array.prototype), я прийшов до наступного коду:

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

Аналізуючи вищезгадану функцію, незважаючи на те, що вона працює нормально, я зрозумів, що може бути деяке поліпшення продуктивності. Также использование 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; })();