Javascript bir sıra bir xüsusi element aradan qaldırılması üçün necə?

Tam sayda bir sıra var və elementləri əlavə etmək üçün .push() metodundan istifadə edirəm.

Xüsusi bir elementi bir dizidən çıxarmaq üçün asan bir yol varmı? array.remove(int); kimi bir şeyin ekvivalenti array.remove(int); .

Əsas javascriptdən istifadə etməliyəm - çərçivələrə icazə verilmir.

6768
24 апр. 24 Aprel tarixində Walker tərəfindən təyin olundu 2011-04-24 01:17 '11 at 1:17 2011-04-24 01:17
@ 77 cavab
  • 1
  • 2
  • 3

Kaldırmak istediğiniz array elementinin index tapın, sonra bu indeksi splice silin.

Splice () metodu, mövcud elementləri silmək və ya yeni elementlər əlavə etməklə bir sıra məzmununu dəyişir.

IndexOf üçün brauzer dəstəyi məhduddur;  Internet Explorer 7 və 8-də dəstəklənmir. 

Desteklenmeyen bir brauzerdə indexOf lazımdırsa, polyfill növbəti polyfill . Bu polyfill haqqında daha ətraflı məlumatı buradan 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 }); 
9756
24 апр. Cavab 24 Aprel tarixində Tom Wadley tərəfindən verildi 2011-04-24 01:23 '11 at 1:23 2011-04-24 01:23

array.remove(int) davranışını necə gözlədiyini bilmirəm. Düşünebileceğiniz üç imkan var.

Bir sıra elementini i indeksiylə aradan qaldırmaq üçün:

 array.splice(i, 1); 

Hər bir elementi arraydan bir number dəyər ilə çıxarmaq istəyirsinizsə:

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

Bir index ilə bir element etmək istəyirsinizsə, artıq mövcud deyil, ancaq digər elementlərin indekslərini dəyişdirməsini istəmirsiniz:

 delete array[i]; 
989
24 апр. Apr 24-də Peter Olson tərəfindən verilmiş cavab 2011-04-24 01:20 '11 at 1:20 'da 2011-04-24 01:20

Oktyabr ayının 2016-da redaktə edildi

  • Sadə, intuitiv və aydın olun ( https://en.wikipedia.org/wiki/Occam%27s_razor )
  • Değişmeyin (orijinal array dəyişməyəcək)
  • Brauzeriniz onları dəstəkləməsə, standart JS funksiyaları ilə bunu edin - polifilləri istifadə edin

Bu kodun nümunəsindəki array.filter (...) funksiyasından istənməyən elementləri bir sıra silmək üçün istifadə edirəm, bu funksiya orijinal sıra dəyişmir və yenisini yaradır. Brauzeriniz bu funksiyanı dəstəkləmirsə (məsələn, 9-cu versiyaya qədər IE və ya Firefox versiya 1.5), Mozilla polifill filterini istifadə edin .

Item silinməsi (ECMA-262 Edition 5 kodu older style JS)

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

Bir elementin silinməsi (ES2015 kodu)

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

Vacib ES2015 "() => {}" arrow funksiyası sözdizimi ümumiyyətlə IE-də dəstəklənmir, versiya 45-ə qədər Chrome, versiya 22-ə qədər Firefox, versiya 10-ə qədər Safari. Eski brauzerlərdə ES2015 sözdizimindən istifadə etmək üçün BabelJS istifadə edə bilərsiniz


Bir çox elementi silmək (ES2016 kodu)

Bu metodun əlavə üstünlüyü ondan ibarətdir ki, bir neçə elementi silə bilərsiniz.

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

ÖNEMLİ "array.includes (...)", IE-də dəstəklənmir, versiya 47-ə qədər Chrome, versiya 43-ə qədər Firefox, 9-cu sürəyə qədər Safari və 14-cü versiyaya qədər Edge, beləliklə, burada Mozilla polyfields

Bir neçə elementi silin (inkişaf etmiş təcrübəli 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 = funksiya çıxar (... forDeletion) {return this.filter (item =>! ForDeletion.includes (item))} arr = [1, 2, 3, 4, 5, 3] Bu cəlb sintaksis təklifi // funksiyanı "virtual üsul" kimi istifadə etmək arr = arr :: remove (2, 3, 5) console.log (arr) // [1, 4] rel = noreferrer> BabelJS özünüzü sınayın: )

Kömək edin

812
19 дек. Cavab 19 dekabrda Ujeenator tərəfindən verilir 2013-12-19 22:54 '13 saat 10:54 'da 2013-12-19 22:54

Boş yerləri saxlamaq istəmədiyinə və ya olmasından asılı olaraq.

Boş bir yuvaya ehtiyac varsa, çıxarılma yaxşı olacaq:

 delete array[ index ]; 

Bunu etməsəniz, əlavə üsuldan istifadə etməlisiniz:

 array.splice( index, 1 ); 

Bu elementin dəyərinə ehtiyacınız varsa, sadəcə dizinin qaytarılmış elementini saxlaya bilərsiniz:

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

Bunu xüsusi bir qaydada etmək istəyirsinizsə, array.pop() üçün sonuncu və ya array.shift() üçün ilk istifadə edə bilərsiniz (və hər ikisi də elementin dəyərini qaytarır).

Bir maddənin indeksini bilmirsinizsə, array.indexOf( item ) istifadə edə bilərsiniz ( if() bir maddə almaq və ya while() hamısını əldə etmək üçün). array.indexOf( item ) bir index və ya tapılmadıqda qaytarır.

381
24 апр. Cavab verildi xavierm02 Apr 24 2011-04-24 01:32 '11 at 1:32 2011-04-24 01:32

Bir dostun Internet Explorer 8 ilə problemi var idi və mənə nə etdiyini göstərdi. Mən ona yanlış olduğunu söylədim və o, burada cavabı aldığını söylədi. Cari üst cavab bütün brauzerlərdə işləməyəcəkdir (məsələn, Internet Explorer 8) və yalnız elementin ilk baş verməsini aradan qaldıracaq.

Bütün nümunələri dizidən sil

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

Ardıcıl olaraq dizidəki hərəkətlər (indekslər və uzunluq elementlər çıxarıldıqdan sonra dəyişəcəkdir) və aşkar edildikdə elementi silir. Bütün brauzerlərdə işləyir.

249
10 авг. 10 Avqustda Ben Lesh tərəfindən verilmiş cavab 2013-08-10 22:21 '13 saat 10:21 'da 2013-08-10 22:21

İki əsas yanaşma var:

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

  • silmək : delete anArray[index];

Bir sıra silmək üçün istifadə etdiyiniz zaman diqqətli olun. Nümunə atributları aradan qaldırmaq üçün yaxşı, lakin dizilər üçün yaxşı deyil. Diziler üçün splice istifadə etmək daha yaxşıdır.

Bir anArray.length üçün anArray.length üçün səhv nəticə əldə edə anArray.length . Başqa sözlə, delete elementi delete , uzunluq xüsusiyyətinin dəyərini yeniləmir.

Məsələn, silinməni istifadə etdikdən sonra index nömrələrində deşiklər gözləmək olar. silinməzdən əvvəl olduğu kimi 1,3,4,8,9,11 və uzunluq indeksləri əldə edə bilərsiniz. Bu halda indekslər artıq ardıcıl olmadığından, döngələr for endeksli bütün bölünəcəkdir.

Nədənsə delete lazımdır, onda for each döngə for each seriallarda təkrarlamaq lazımdır. Əslində, əgər mümkünsə həmişə döngüler üçün endeksli istifadə etməyin. Beləliklə, kod daha etibarlı və indekslərlə bağlı problemlərə daha az meylli olacaqdır.

140
21 дек. cavab Sasa 21 dekabr verilir . 2012-12-21 14:32 '12 at 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 апр. cavab Zirak 24 apr verilir . 2011-04-24 01:20 '11 at 1:20 'da 2011-04-24 01:20

indexOf və ya splice istifadə etmək lazım deyil. Ancaq maddənin yalnız bir nüsxəsini qaldırmaq istəsəniz daha yaxşı işləyir.

Tapın və hərəkət edin (hərəkət et):

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

indexOfsplice (indexof) istifadə edin:

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

Yalnız əlavə:

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

1000 ədəd elementli bir sıra üçün nodejs üçün qurğuşun vaxtı (10,000-dən çox işin ortalaması):

İndeks hərəkətdən təxminən 10 dəfə daha yavaşdır. Bir əlavə olaraq indexOf çağırışını aradan qaldırmaqla yaxşılaşdırılırsa belə hərəkət daha pisdir.

 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 сент. Cavab 19 sentyabrda verildi 2013-09-19 04:53 '13 'da 4:53' də 2013-09-19 04:53

Ən asan yol:

 var index = array.indexOf(item); if(index != -1) array.splice( index, 1 ); 
81
02 дек. Cavab Nanego tərəfindən verilir 02 Dekabr. 2017-12-02 20:42 '17 saat 20:42 'da 2017-12-02 20:42

Çox köhnə cavab vermək, ancaq bir dəyəri əvəzinə bir təsis təmin edərək kimsə kömək edə bilər.

Qeyd: bu ardıcıllığı yeniləyir və təsirlənmiş xəttləri qaytarır.

İstifadə

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

Təsvir

 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 cavab 02 may '14 saat 15: 00-da verilir

John Reçiq yaxşı bir şəkildə nəşr etdi :

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

Qlobal obyekti uzatmaq istəmirsinizsə, aşağıdakı kimi bir şey edə bilərsiniz:

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

Amma bunu yayımlamağımın əsas səbəbi, bu səhifənin şərhlərində təklif olunan alternativ tətbiq haqqında istifadəçiləri xəbərdar etməkdir (14 dekabr, 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; }; 

Əvvəlcə yaxşı işləyirəm, ancaq ağrılı bir proses keçirdiyindən kəşf etdiyimə görə, işləməyincə, ikincisini dizidəki son elementə aparmağa çalışırdım. Məsələn, 10 elementli bir sıra varsa və 9 elementi bu ilə aradan qaldırmağa çalışırsınızsa:

 myArray.remove(8); 

Nəticədə, siz 8 elementli array alırsınız. Bilmirəm niyə, amma təsdiq edirəm ki, Yəhyanın orijinal tətbiqinin bu problemi yoxdur.

55
30 авг. cavab Roger 30 aug verilir . 2013-08-30 22:07 '13 at 10:07 pm 2013-08-30 22:07

Underscore.js birdən çox brauzer ilə problemləri həll etmək üçün istifadə edilə bilər. İstənilən halda brauzerinizin quraşdırılmış metodlarından istifadə edir. Internet Explorer-ın köhnə versiyalarında olduğu kimi itkin olduqda, öz üsullarını istifadə edir.

Bir elementdən (veb saytdan) elementləri silmək üçün sadə bir nümunə:

 _.without([1, 2, 1, 0, 3, 1, 4], 0, 1); // => [2, 3, 4] 
53
30 мая '14 в 12:57 2014-05-30 12:57 Cavab vatsal tərəfindən 30 may 'da saat 12:57' də verilir 2014-05-30 12:57

Bunu filtre metodu ilə asanlıqla edə bilərsiniz:

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

Bu, bütün elementləri serialdan çıxarır və həmçinin dilim və indexOf birləşməsindən daha sürətli işləyir.

52
11 февр. Cavab Salvador Dali tərəfindən verilir 11 fevral. 2014-02-11 01:06 '14 da 1:06 2014-02-11 01:06

Silinmiş mövqeləri olan yeni bir sildiyi silmək istəsəniz, həmişə xüsusi bir elementi silə və serialın süzgəldə bilərsiniz. Filtre yöntemini uygulamayan brauzerlər üçün dizi nesnesini genişletmeniz tələb oluna bilər, lakin uzun müddətdə bunu asanlaşdırırsınız, çünki bütün bunlar aşağıdakılardır:

 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 oktyabrda cavab verin 2012-10-18 13:13 '12 'də 13:13' də 2012-10-18 13:13

ES6-dan istifadə edə bilərsiniz.

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

Çıxış:

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

Bu kodu yoxlayın. Hər bir əsas brauzerdə işləyir. .

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

Bu funksiyanı çağırın

 remove_item(array,value); 
34
02 апр. Cavab Ekramul Hoque tərəfindən verilir 02 Aprel. 2013-04-02 13:56 '13 at 13:56 2013-04-02 13:56

Siz lövhəni istifadə edə bilərsiniz . pull (mutate array), _.pullAt (mutate array) və ya _. olmadan (array mutate deyil),

 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 авг. Cavab Chun Yang 25 aug verilir. 2015-08-25 22:34 '15 at 10:34 pm 2015-08-25 22:34

Tamam, məsələn, aşağıda bir sıra var:

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

Və 4 nömrəsini silmək istəyiriksə, aşağıdakı kodu edə bilərsiniz:

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

Bu funksiyanı yenidən istifadə etsəniz, aşağıda göstərildiyi kimi Native array funksiyasına bağlı olan yenidən istifadə funksiyası yazırsınız:

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

Ancaq aşağıda bir sıra və bir neçə [5] s var?

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

Bütün bunları yoxlamaq üçün bir loopa ehtiyacımız var, ancaq JavaScript funksiyalarını daha asan və daha səmərəli istifadə etmək lazımdır, beləliklə aşağıda göstərilən filtrdən istifadə edən bir funksiyanı yazırıq:

 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] 

Bunun üçün, üçüncü tərəf kitabxanaları da var, məsələn, Lodaş və ya Altçizgi kimi, lövhə haqqında daha ətraflı məlumat üçün, _.pullAt və ya _.without.

32
10 мая '17 в 12:39 2017-05-10 12:39 Cavab Əlireza tərəfindən 10 May '17 'də 12:39 2017-05-10 12:39' də verilir

Javascript üçün yeniyim və bu xüsusiyyətə ehtiyacım var. Mən bunu yalnız yazdım:

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

Sonra istifadə etmək istədiyiniz zaman:

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

Çıxışın - gözlənildiyi kimi. ["item1", "item1"]

Məndən çox fərqli ehtiyaclarınız ola bilər, buna görə onları rahatlıqla dəyişə bilərsiniz. Bu birinə kömək edir.

27
16 янв. cavab 16 yanvar Sophiax tərəfindən verilir 2014-01-16 14:27 '14 14:27 2014-01-16 14:27

ES6 və mutasiya olmadan: (oktyabr 2016)

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

Sonra:

 removeByIndex([33,22,11,44],1) //=> [33,11,44] 
24
07 окт. Abdennour TOUMI tərəfindən verilmiş cavab Oct 07 2016-10-07 22:42 '16 saat 10:42 'da 2016-10-07 22:42

Yeniləmə: Bu üsul yalnız ECMAScript 2015 (əvvəllər ES6 kimi tanınır) istifadə edə bilməzsinizsə, tövsiyə olunur. Bunu istifadə edə bilərsiniz, burada digər cavablar çox inkişaf etmiş tətbiqlər verir.


Burada bu məna sizin probleminizi həll edəcək, eyni zamanda, yalnız 1 (və ya müəyyən edilmiş dəyər) deyil, arqumentin bütün hallarını aradan qaldıracaq.

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

Ərizə:

 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 Cavab zykadelic verilir 13 Mart '13, 12:28 2013-03-13 12:28

Bir dizidəki kompleks obyektləriniz varsa, filtrlərdən istifadə edə bilərsinizmi? $ .İnArray və ya array.splice istifadə üçün asandır olduğu hallarda. Xüsusilə obyektlər dizidəki kiçik olsaydı.

məsələn. Id alanına malik bir obyektiniz varsa və obyektin dizidən çıxarılmasını istəyirsinizsə:

 this.array = this.array.filter(function(element, i) { return element.id !== idToRemove; }); 
20
09 апр. cavab 09 may apreli gün verilir . 2015-04-09 13:00 '15 saat 13:00 'də 2015-04-09 13:00

Javascript istifadə edərək, bir elementdən bir element çıxarmaq üçün bəzi yollar.

Bütün təsvir edilmiş üsullar orijinal serialı dəyişmir və bunun əvəzinə yenisi yaradır.

Maddənin indeksini bilirsinizsə

Bir sıra var deyirsiniz və bir elementi i mövqeyində silmək i .

Biri slice() istifadə etməkdir:

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

ES6 oxlarının funksiyalarından istifadə edir. Eski brauzerləri dəstəkləmək üçün ənənəvi xüsusiyyətləri istifadə edə bilərsiniz:

 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) 

Qiymətə görə

Geri çağırma funksiyası daxilində daxil ola bilərsiniz:

https://flaviocopes.com/how-to-remove-item-from-array/ saytında yerləşdirilib) 

20
04 мая '18 в 8:17 2018-05-04 08:17 Cavab Flavio Copes tərəfindən mayın 04-də saat 18: 18- də verilir. 2018-05-04 08:17

Bir dizi dizisini asla mutasiya etməməlisiniz. Çünki funksional proqramlaşdırma nümunəsinə ziddir. Nə edə bilərsiniz ki ES6 filter üsulu ilə məlumatları dəyişdirmək istədiyiniz diziyə istinad olmadan yeni bir sıra yaradır;

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

Bir dizidən 5 çıxarmaq istəyirsən, yalnız bunu edə bilərsiniz.

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

Bu silmək istədiyiniz dəyəri olmadan yeni bir sıra verəcəkdir. Beləliklə nəticə olacaq

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

Daha ətraflı məlumat üçün MDR sənədlərini Array.filter-də oxuya bilərsiniz. Https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter

19
26 дек. Adeel Imran tərəfindən verilmiş cavab 26 dekabr 2017-12-26 22:32 '17 saat 10:32 'da 2017-12-26 22:32

Daha müasir, ECMAScript 2015 (əvvəllər Harmony və ya ES 6 kimi tanınır). Verilənlər:

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

Sonra:

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

Sessiya:

 [1, 2, 4] 

Siz brauzerlər yaxşıdır ki, Babelpolyfill xidmətindən istifadə edə bilərsiniz.

18
25 апр. cavab bjfletcher 25 apr tərəfindən verilir . 2016-04-25 13:21 '16 saat 13:21 'də 2016-04-25 13:21

Bilirəm ki, artıq bir çox cavab var, amma onların əksəriyyəti problemi çətinləşdirir. Burada bir index tapılıncaya qədər özünü çağırmaq üçün bütün nümunələrini çıxarmaq üçün sadə, təkrarlayıcı bir yoldur. Bəli, yalnız indexOf ilə brauzerlərdə işləyir, lakin sadədir və asanlıqla doldurula bilər.

Avtonom funksiya

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

Prototip metodu

 Array.prototype.removeAll = function(key){ var index = this.indexOf(key); if(index === -1) return; this.splice(index, 1); this.removeAll(key); } 
16
03 февр. Cavab verildi28 03 fevral. 2014-02-03 18:41 '14 də 18:41 2014-02-03 18:41

Bir dizidən çıxarmaq üçün başqa bir yaxşı həll var:

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

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

15
05 июня '18 в 17:47 2018-06-05 17:47 Aram Qriqoryana 05 iyun 18: 17-də saat 17: 00-da cavab verən 2018-06-05 17:47

Elementin bir neçə nüsxəsi olduqda göstəriciləri aşağı çəkməyinizə əmin olmaq üçün əks loop edə bilərsiniz.

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

Canlı demo

15
12 авг. Cavab Jeff Noel 12 avqust tərəfindən verilir . 2013-08-12 20:56 '13 saat 20:56 'də 2013-08-12 20:56

Əsasən düzgün olan bütün cavabları nəzərə alaraq və ən yaxşı tövsiyələri nəzərə alaraq (xüsusilə Array.prototype istifadə etmədən) aşağıdakı kodu gətirdim:

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

Yuxarıda göstərilən funksiyanı təhlil edərkən, yaxşı işlədiyinə baxmayaraq, bəzi performansın yaxşılaşması ola bilər. ES5 yerinə ES6 istifadə edərək daha yaxşı bir yanaşma. Bunu etmək üçün, bu təkmilləşdirilmiş bir koddur:

 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

Другие вопросы по меткам или Задайте вопрос