Як выдаліць пэўны элемент з масіва ў JavaScript?

У мяне ёсць масіў цэлых лікаў, і я выкарыстоўваю метад .push() для дадання ў яго элементаў.

Ці ёсць просты спосаб выдаліць пэўны элемент з масіва? Эквівалент чагосьці тыпу array.remove(int); .

Мне трэба выкарыстоўваць базавы JavaScript - ніякіх фреймворков забаронена.

6774
24 апр. зададзены Walker 24 крас. 2011-04-24 01:17 '11 у 01: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 апр. адказ дадзены Tom Wadley 24 крас. 2011-04-24 01:23 '11 у 01: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 у 01:20 2011-04-24 01: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 у 01: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 авг. адказ дадзены 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 у 01: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 элементамі (у сярэднім больш за 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 у 04:53 2013/09/19 04: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 00: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 у 01: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 крас. 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 00: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 00: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 08: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; })();