Javascriptdə array uzunluğunu necə başlatmaq olar?

JavaScript-də ( w3schoolsdevguru daxil olmaqla) JavaScript-də dərslərdəki oxuduğum dərsliklərin əksəriyyəti , sətrin variantı istifadə edərək, Array konstruktoruna bir tamsayı keçərək müəyyən bir uzunluqla bir sıra işə sala biləcəyinizi fərz etsin var test = new Array(4); .

Bu sözdizimi mənim js fayllarımdan istifadə etdikdən sonra jsLint vasitəsilə fayllardan birini işə saldım və qorxdum:

Səhv: xətt simvolu ilə problem 1 22: Beklenen ')' və bunun əvəzinə '4' gördüm.
var test = yeni Array (4);
Xətt simvolu ilə problem 1 23: Gözlənilən ';' və yerinə ")" gördüm.
var test = yeni Array (4);
Xətt simvolu ilə problem 1 23: Gözlənilən identifikator və bunun əvəzində bir '' 'gördüm.

JsLint'in davranışının izahını oxuduqdan sonra, jsLint new Array() sözdiziminə çox bənzəməyən və sətirləri elan edərkən [] üstünlük verir.

Yəni bir neçə sualım var. Birincisi, niyə? new Array() sözdizimindən istifadə etmə riskini alıram? Bilmirəm hər hansı bir brauzerinizin uyğunsuzluqları varmı? İkincisi, kvadrat mötərizənin sintaksisinə keçsəniz, bir sıra elan etmək və uzunluğunu bir xəttə təyin etmək üçün bir yol varmı və ya belə bir şey etmək lazımdır?

 var test = []; test.length = 4; 
376
31 янв. Michael Martin-Smucker tərəfindən təyin olunan Jan 31 2011-01-31 17:29 '11 saat 17:29 'də 2011-01-31 17:29
@ 17 cavab
  • Niyə uzunluğu başlamaq üçün istəyirsiniz? Teorik olaraq, bu lazım deyil. Çətin davranışa belə gətirib çıxara bilər, çünki array boş və ya olmadığını tapmaq üçün length istifadə edən bütün testlər dizinin boş olmadığını bildirəcəkdir.
    Bəzi testlər , böyük dizilərin başlanğıc uzunluğunu təyin etmək, dizinin sonradan doldurulması halında daha effektiv ola biləcəyini göstərir, lakin performans artımı (varsa) brauzerdən brauzerdən fərqlənir.

  • jsLint new Array() kimi deyil, çünki konstruktor qeyri-müəyyəndir.

     new Array(4); 

    uzunluğu boş bir sıra yaradır 4. Lakin

     new Array('4'); 

    '4' dəyəri olan bir sıra yaradır.

Yorumunuzla bağlı olaraq: JS'de dizinin uzunluğunu başlatmanız lazım deyil. Dinamik şəkildə böyüyür. Məsələn, məsələn uzunluğu bir dəyişəndə ​​saxlaya bilərsiniz.

 var data = []; var length = 5; // user defined length for(var i = 0; i < length; i++) { data.push(createSomeObject()); } 
295
31 янв. Cavab 31 yanvarda Felix Kling tərəfindən verilir . 2011-01-31 17:32 '11 at 17:32 2011-01-31 17:32
  • Array(5) sizə uzunluğu 5 olan bir sıra verir, lakin dəyərsizdir, buna görə təkrar edə bilməzsiniz.

  • Array.apply(null, Array(5)).map(function() {}) 5 uzunluğunda bir sıra ve tanımsız bir değer sunar, şimdi tekrarlanabilir.

  • Array.apply(null, Array(5)).map(function (x, i) { return i; }) uzunluğu 5 və 0,1,2,3,4 olan bir sıra verir.

  • Array(5).forEach(alert) heç bir şey yoxdur, Array.apply(null, Array(5)).forEach(alert) 5 xəbərdarlıq verir

  • ES6 bizə ES6 verir və indi Array.from(Array(5)).forEach(alert) istifadə edə bilərsiniz Array.from(Array(5)).forEach(alert)

  • Müəyyən bir dəyəri ilə başlamaq istəyirsinizsə, bu bilmək faydalıdır ...
    Array.from('abcde') , Array.from('x'.repeat(5))
    və ya Array.from({length: 5}, (v, i) => i)//gives [0, 1, 2, 3, 4]

border=0
371
19 февр. Cavab 19 fevral tarixində Ruben Stolk tərəfindən verilir . 2015-02-19 08:41 '15 at 8:41 'da 2015-02-19 08:41

ES2015 ilə .fill() yalnız indi edə bilərsiniz:

 // 'n' is the size you want to initialize your array // '0' is what the array will be filled with (can be any other value) Array(n).fill(0) 

Array.apply(0, new Array(n)).map(i => value) müqayisədə daha qısadır Array.apply(0, new Array(n)).map(i => value)

0 .fill() silmək və .fill() undefined ilə dolduracaq dəlilləri olmadan işləyə bilərsiniz. (Lakin, bu yazı tipində baş verə bilməz)

151
Cavab AP tərəfindən verilir . 2017-03-01 21:24 01 mart '17 'da 21:24' də 2017-03-01 21:24 'də

Ən qısa:

 [...Array(1000)] 
40
21 дек. Michael Mammoliti tərəfindən verilmiş cavabı 21 dekabr 2017-12-21 19:46 '17 saat 19:46 'da 2017-12-21 19:46

ES6 hər hansı bir "array-like" və ya iterable obyektlərin bir Array yaratmaq imkan verir Array.from təmsil edir:

 Array.from({length: 10}, (x, i) => i); // [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 

Bu halda, {length: 10} bir "array kimi" obyektin minimal tərifini əks etdirir: yalnız length müəyyən edilmiş boş bir obyekt.

Array.from nəticəsində array göstərmək üçün ikinci arqument istifadə etməyə imkan verir.

23
10 янв. Aleksandr Şutovun 10 yanvarda verdiyi cavabı 2018-01-10 19:19 '18 at 19:19 2018-01-10 19:19

Uzunluğu 4:

 var x = [,,,,]; 
20
31 янв. Šime Vidas tərəfindən verilmiş cavab 31 yanvar 2011-01-31 17:35 '11 'də 17:35' də 2011-01-31 17:35 'da
 [...Array(6)].map(x=>0); // [0, 0, 0, 0, 0, 0] 

Və ya eyni

 Array(6).fill(0); // [0, 0, 0, 0, 0, 0] 

Və ya eyni

 Array(6).fill(null).map( (x,i) => i ); // [0, 1, 2, 3, 4, 5] 

(yazı kasası)


Daxili Diziler Yaratmaq

fill 2D bir sıra yaradılarkən, yeni hallarda intuitiv olaraq yaratmalısınız. Amma həqiqətən baş verənlər eyni array referans olaraq saxlanılacaq.

 var a = Array(3).fill([6]); // [[6], [6], [6]] a[ 0 ].push( 9 ); // [[6,9], [6,9], [6,9]] 

Həll

 var a = [...Array(3)].map(x=>[]); a[ 0 ].push( 4, 2 ); // [[4,2], [ ], [ ]] 

Beləliklə, bir 3x2 array belə bir şeyə baxar:

 [...Array(3)].map(x=>Array(2).fill(0)); // [ [0,0] , // [0,0] , // [0,0] ] 
20
09 апр. Cavab verilmişdir Vlad 09 Aprel. 2018-04-09 14:42 '18 at 2:42 pm 2018-04-09 14:42

Mən bir xətt uzunluğunu müəyyən etməyə imkan verən heç bir funksional həll təklif edilmədiyi üçün təəccübləndim. Aşağıda UnderscoreJS əsas götürülmüşdür:

 var test = _.map(_.range(4), function () { return undefined; }); console.log(test.length); 

Yuxarıda göstərilən səbəblərə görə, serialın müəyyən bir dəyərə başlamasını istəmədimsə, bunu etməkdən çəkinərdim. Qeyd edək ki, Lo-dash və Lazy, müxtəlif performans xüsusiyyətlərinə malik ola biləcək bir sıra tətbiq edən digər kitabxanalar mövcuddur.

15
23 апр. 23 Apreldə christang tərəfindən verilmiş cavab 2014-04-23 07:31 '14 saat 07:31 'də 2014-04-23 07:31

(yəqin ki, bir şərhdən daha yaxşı idi, amma çox uzun idi)

Bunu oxuduqdan sonra mən əvvəlcədən seçimin həqiqətən daha sürətli olduğunu düşünürdüm, çünki nəzəri cəhətdən olmalıdır. Lakin, bu blog ona qarşı bəzi məsləhətlər verdi: http://www.html5rocks.com/en/tutorials/speed/v8/ .

Yəni, hələ də əmin deyiləm ki, testə qoyduq. Və ortaya çıxdı ki, əslində daha yavaş.

 var time = Date.now(); var temp = []; for(var i=0;i<100000;i++){ temp[i]=i; } console.log(Date.now()-time); var time = Date.now(); var temp2 = new Array(100000); for(var i=0;i<100000;i++){ temp2[i] = i; } console.log(Date.now()-time); 

Bu kod bir neçə təsadüfi işdən sonra aşağıdakıları verir:

 $ node main.js 9 16 $ node main.js 8 14 $ node main.js 7 20 $ node main.js 9 14 $ node main.js 9 19 
7
26 февр. cavab j03m 26 fevral. 2014-02-26 17:25 '14 da 17:25 2014-02-26 17:25
 var arr=[]; arr[5]=0; alert("length="+arr.length); // gives 6 
5
28 апр. cavab user1067305 Apr 28 tərəfindən verilmişdir 2014-04-28 02:27 '14 da 2:27 2014-04-28 02:27

Burada başqa bir həll var.

 var arr = Array.apply( null, { length: 4 } ); arr; // [undefined, undefined, undefined, undefined] (in Chrome) arr.length; // 4 

Başvuracağınız ilk arqument apply() bu obyektin bağlanmasıdır, biz bu barədə umurumuzu düşünmürük, buna görə null .

Array.apply(..) Array(..) funksiyasını çağırır və obyektin dəyərini { length: 3 } argumentləri kimi genişləndirir.

4
31 дек. Cavab 31 dekabr, zangw verilir. 2015-12-31 05:01 '16 'da saat 05:01' de 2015-12-31 05:01

Xahiş edirik, insanlar hələ köhnə vərdişlərindən imtina etmirlər. Yaddaşın bir dəfə ayrılması arasındakı sürət arasında böyük fərq var, sonra bu dizidəki qeydlərlə işləyir (köhnə kimi) və dizi böyüdükcə dəfələrlə paylayır (sistemin baş örtüyü altında digər təklif olunan üsullarla nə etməli olduğu qaçılmazdır)

Əlbəttə, bütün bunlar böyük bir dizi ilə sərin bir şey etmək istəyənə qədər əhəmiyyətli deyil. Sonra da.

JS-də dizinin başlanğıc tutumunu təyin etmək hələ də mümkün olmadığından, mən aşağıdakıları istifadə edirəm ...

 var newArrayWithSize = function(size) { this.standard = this.standard||[]; for (var add = size-this.standard.length; add>0; add--) { this.standard.push(undefined);// or whatever } return this.standard.slice(0,size); } 

Müsabiqələr var:

  • Bu metod, ilk funksiya çağırışı üçün başqaları kimi çox vaxt alır, lakin sonrakı zənglər üçün çox az vaxtdır (daha böyük bir sıra tələb edilmirsə).
  • standard array daim ən böyük sıra istəkləri kimi çox yer tutur.

Ancaq bunu etdiyiniz şeylə razılaşarsa, ödəmə edə bilər. Informal şərtlər müəyyən edilmişdir

 for (var n=10000;n>0;n--) {var b = newArrayWithSize(10000);b[0]=0;} 

olduqca tez (10,000-ə yaxın təxminən 50 ms, n = 1,000,000-ə qədər təxminən 5 saniyə çəkdi)

 for (var n=10000;n>0;n--) { var b = [];for (var add=10000;add>0;add--) { b.push(undefined); } } 

bir dəqiqədən çox (eyni xrom konsolunda 10 minə yaxın təxminən 90 saniyə yaxud təxminən 2000 dəfə daha yavaş). Bu, yalnız bölüşdürmə deyil, həm də dövrü 10.000 klik olacaq.

3
02 марта '16 в 13:02 2016-03-02 13:02 cavab 02 mart '16 'da 13:02 2016-03-02 13:02' ye verilir

Serialın konstruktorunda qeyri-müəyyən sintaksis var və JSLint yalnız hisslərinizə acıq verir.

Bundan əlavə, nümunə SyntaxError sınıq, ikinci var operatoru SyntaxError dəyərini qaldırır. Sınaq arrayının length xüsusiyyətini təyin etdiniz, buna görə də başqa bir ehtiyac yoxdur.

Seçeneklerinize gəldikdə, array.length yalnız "təmiz" birdir. Sual, niyə ilk ölçüsü təyin etmək lazımdır? Bu asılılığı qurtarmaq üçün kodunuzu yenidən təşkil edin.

2
31 янв. 31 yanvarda Ivo Wetzel'e cavab verdi 2011-01-31 17:34 '11 saat 05:34 'da 2011-01-31 17:34

new Array istifadə etməməyin səbəbi bu new Array göstərilib:

 var Array = function () {}; var x = new Array(4); alert(x.length); // undefined... 

Bəzi digər kodlar Array dəyişən ilə pozulub bilər. Bilirəm ki, bu, birinin yazı yazacağından bir qədər uzaqdır, amma yenə də ...

Əlavə olaraq, Felix King dediyi kimi, interfeys bir az ziddiyyətli və çox mürəkkəb səhvlərə səbəb ola bilər.

Uzunluğu = x olan bir sıra lazımdırsa, unrefined ilə doldurulur ( new Array(x) edərdi) bunu edə bilərsiniz:

 var x = 4; var myArray = []; myArray[x - 1] = undefined; alert(myArray.length); // 4 
0
31 янв. Cavab 31 yanvarda ləqəb verilir 2011-01-31 17:34 '11 saat 05:34 'da 2011-01-31 17:34

Serialın uzunluğunun sabit olduğunu düşünürəm. Javascript-da biz bunu edirik:

const intialArray = new Array(specify the value);

0
23 дек. mohan babu tərəfindən verilmiş cavab 23 Dek 2018-12-23 06:00 '18, 6:00 'də 2018-12-23 06:00' də

Yuxarıda açıqlandığı kimi, new Array(size) istifadə edərək bir az təhlükəlidir. Birbaşa istifadə etmək əvəzinə, "array yaradan funksiyası" na qoyun. Siz asanlıqla bu funksiyanın mövcud olmadığından əmin ola bilərsiniz və doğrudan new Array(size) çağırma təhlükəsinin qarşısını new Array(size) . Buna əlavə olaraq, bu isteğe bağlı ilk başlanğıc dəyərini verə bilərsiniz. Bu createArray funksiyası tam olaraq createArray :

 function createArray(size, defaultVal) { var arr = new Array(size); if (arguments.length == 2) { // optional default value for (int i = 0; i < size; ++i) { arr[i] = defaultVal; } } return arr; } 
0
04 янв. cavab Domi 04 jan verilir . 2014-01-04 14:53 '14 da 14:53 2014-01-04 14:53

array.length = youValue istifadə edərək, array.length = youValue uzunluğunu təyin edə bilərsiniz

Belə olacağıq

 var myArray = []; myArray.length = yourValue; 
-2
09 июня '17 в 22:33 2017-06-09 22:33 Cavab 09/07/09 tarixində saat 10: 33-dən 2017-06-06 22:33 tarixində verilir

tags ilə bağlı digər suallar və ya bir sual