Как да премахнете конкретен елемент от масив в javascript?

Имам масив от цели числа и използвам метода .push() , за да добавя елементи към него.

Има ли лесен начин за премахване на конкретен елемент от масив? Еквивалентът на нещо като array.remove(int); ,

Трябва да използвам javascript - няма разрешени рамки.

6774
24 апр. зададен от Уокър на 24 април 2011-04-24 01:17 '11 в 1:17 2011-04-24 01: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 апр. Отговорът беше даден от Том Уодли на 24 април 2011-04-24 01:23 '11 в 1:23 2011-04-24 01: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 01:20

Редактирано 2016 октомври

  • Направете го просто, интуитивно и изрично ( https://en.wikipedia.org/wiki/Occam%27s_razor )
  • Направете го непроменен (първоначалният масив ще остане непроменен)
  • Направете го със стандартни JS функции, ако вашият браузър не ги поддържа - използвайте polyfill

В този пример използвам функцията array.filter (...) за премахване на нежелани елементи от масив, тази функция не променя първоначалния масив и създава нов, ако браузърът ви не поддържа тази функция (например IE до версия 9 или Firefox преди версия 1.5), помислете за използване на многолистния филтър на Mozilla .

Изтриване на елемент (код ECMA-262 издание 5, известен още като 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))} нека arr = [1, 2, 3, 4, 5, 3] // :: Предложение за това-свързване на синтаксис // използване на функцията за премахване като "виртуален метод" 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 ]; 

Ако не направите това, трябва да използвате метода на снаждане :

 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 01: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 авг. Отговор, даден от Бен Леш 10 август 2013-08-10 22:21 '13 в 22:21 часа 2013-08-10 22:21

Има два основни подхода:

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

  • delete : delete anArray[index];

Бъдете внимателни, когато използвате delete за масив. Това е добре за премахване на атрибути на обекти, но не е толкова добро за масиви. По-добре да използваме splice за масиви.

Имайте предвид, че когато използвате delete за масив, може да получите неправилни резултати за anArray.length . С други думи, delete изтрива елемента, но не актуализира стойността на свойството дължина.

Можете също така да очаквате дупки в индексните номера след използване на изтриване, например. можете да получите индекси от 1,3,4,8,9,11 и дължина, както е било преди използването на заличаването. В този случай всички индексирани for цикли ще бъдат разделени, тъй като индексите вече не са съвместими.

Ако по някаква причина трябва да използвате delete , тогава трябва да използвате for each цикъл, когато трябва да повторите чрез масиви. Всъщност винаги избягвайте да използвате индексирани за цикли, ако е възможно. Така, кодът ще бъде по-надежден и по-малко податлив на проблеми с индексите.

140
21 дек. отговорът е даден Sasa 21 Dec. 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 01: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 елемента (средно повече от 10 000 писти):

Показателят е около 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 сент. Отговорът е даден на 19 септември 2013-09-19 04:53 '13 в 4:53 2013-09-19 04:53

Най-лесният начин:

 var index = array.indexOf(item); if(index != -1) array.splice( index, 1 ); 
81
02 дек. Отговорът е даден от Нанего 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

Джон Ресиг публикува добро изпълнение :

 // 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 елемента. Не знам защо, но потвърдих, че първоначалното изпълнение на Джон няма този проблем.

55
30 авг. отговорът е даден на Roger 30 aug. 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

Можете да направите това лесно с метода на филтъра :

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

Това премахва всички елементи от масива, а също така работи по-бързо от комбинацията от фрагменти и индекси.

52
11 февр. Отговорът е даден от Салвадор Дали на 11 февруари. 2014-02-11 01:06 '14 в 1:06 2014-02-11 01: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 Apr. 2013-04-02 13:56 '13 в 13:56 2013-04-02 13:56

Можете да използвате lodash _. дръпнете ( мутиращ масив), _.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 авг. отговорът е даден на Чун Ян 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] в масива?

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

Приложение:

 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 Отговорът е даден от Флавио Копс на 04 май 18 в 8:17 ч. 2018-05-04 08:17

Никога не трябва да мутирате масив. Защото той противоречи на функционалния модел на програмиране. Това, което можете да направите, е да създадете нов масив без препратка към масива, който искате да модифицирате, използвайки метода на filter ES6;

 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 Dec 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 в 1:21 ч. 2016-04-25 13:21

Знам, че вече има много отговори, но много от тях изглежда усложняват проблема. Ето един прост, рекурсивен начин за премахване на всички копия на ключ - той призовава себе си, докато не бъде намерен индекс. Да, той работи само в браузъри с 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 Feb. 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 отговори на Арам Григорян на 05.06.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); } 

Демонстрация на живо

15
12 авг. отговорът е даден от Джеф Ноел 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; })(); 

Как да използвате:

 const arr = [1,2,3,4,5,"name", false]; arrayWithoutFastest(arr, 1); // will return array [2,3,4,5,"name", false] arrayWithoutFastest(arr, 'name'); // will return [2,3,4,5, false] arrayWithoutFastest(arr, false); // will return [2,3,4,5] arrayWithoutFastest(arr,[1,2]); // will return [3,4,5,"name", false]; arrayWithoutFastest(arr, {bar: "foo"}); // will return the same array (new copy) 

В настоящее время я пишу сообщение в блоге, в котором проверил несколько решений для Array без проблем и сравнил время, необходимое для запуска. Я дополню этот ответ ссылкой, как только закончу этот пост. Просто чтобы вы знали, я сравнил вышеупомянутое с lodash без, и если браузер поддерживает Map , он превосходит lodash! Обратите внимание, что я не использую Array.prototype.indexOf или Array.prototype.includes поскольку обертывание exlcudeValues в Map или Object ускоряет выполнение запросов!

15
ответ дан Ardi 28 янв. '14 в 17:44 2014-01-28 17:44
  Array.prototype.removeItem = function(a) { for (i = 0; i < this.length; i++) { if (this[i] == a) { for (i2 = i; i2 < this.length - 1; i2++) { this[i2] = this[i2 + 1]; } this.length = this.length - 1 return; } } } var recentMovies = ['Iron Man', 'Batman', 'Superman', 'Spiderman']; recentMovies.removeItem('Superman'); 
13
ответ дан Don Vincent Preziosi 26 сент. '13 в 3:12 2013-09-26 03:12
  • 1
  • 2
  • 3

Други въпроси, свързани с на тагове или Задайте въпрос