Kaip inicijuoti masyvo ilgį javascript'e?

Dauguma pamokų, kurias perskaičiau „JavaScript“ masyvuose (įskaitant w3schools ir devguru ), daro prielaidą, kad galite inicijuoti masyvą su tam tikru ilgiu, perduodant sveiką skaičių į Array konstruktorių, naudojant sintaksės var test = new Array(4); .

Naudodamas šią sintaksę savo „js“ failuose, vieną iš failų paleidžiau „jsLint“ , ir jis bijo:

Klaida: problema su linijos simboliu 1 22: tikėtasi ')' ir vietoj to pamatė '4'.
var test = new Array (4);
Problema su linijos simboliu 1 23: laukiama „;“ ir vietoj pamačiau „)“.
var test = new Array (4);
Problema su linijos simboliu 1 23: Tikėtinas identifikatorius ir vietoj pamačiau „“).

Perskaičius jsLint savo elgesio paaiškinimą , atrodo, kad jsLint nėra labai panašus į new Array() sintaksę, o vietoj to, kai skelbia masyvus, pageidauja [] .

Taigi, turiu keletą klausimų. Pirma, kodėl? Ar rizikuoju naudoti new Array() sintaksę? Ar yra kokių nors naršyklės nesuderinamumų, apie kuriuos turėčiau žinoti? Ir, antra, jei persijungsiu į kvadratinių skliaustų sintaksę, ar yra būdas deklaruoti masyvą ir nustatyti jo ilgį vienoje eilutėje, ar turiu daryti kažką panašaus:

 var test = []; test.length = 4; 
376
31 янв. pateikė Michael Martin-Smucker 31 d 2011-01-31 17:29 '11, 17:29, 2011-01-31 17:29
@ 17 atsakymų
  • Kodėl norite inicijuoti ilgį? Teoriškai tai nėra būtina. Tai netgi gali sukelti painią elgseną, nes visi testai, kurie naudoja length , nustato, ar masyvas yra tuščias, ar ne, praneša, kad masyvas nėra tuščias.
    Kai kurie bandymai rodo, kad pradinių didelių matricų ilgio nustatymas gali būti efektyvesnis, jei masyvas vėliau bus užpildytas, tačiau našumo padidėjimas (jei toks yra), atrodo, skiriasi nuo naršyklės.

  • jsLint nemėgsta new Array() nes konstruktorius yra dviprasmiškas.

     new Array(4); 

    sukuria tuščią 4 ilgio matricą

     new Array('4'); 

    sukuria masyvą, kurio vertė yra '4' .

Dėl jūsų komentaro: JS jums nereikia inicijuoti masyvo ilgio. Ji dinamiškai auga. Pvz., Galite paprasčiausiai išsaugoti ilgį.

 var data = []; var length = 5; // user defined length for(var i = 0; i < length; i++) { data.push(createSomeObject()); } 
295
31 янв. atsakymą pateikė Felixas Klingas . 2011-01-31 17:32 '11, 17:32, 2011-01-31 17:32
  • Array(5) suteikia jums masyvą, kurio ilgis yra 5, bet be reikšmių, todėl jūs negalite pakartoti jo.

  • Array.apply(null, Array(5)).map(function() {}) suteikia masyvą, kurio ilgis yra 5 ir neapibrėžta reikšmė, dabar jis gali būti pakartotas.

  • Array.apply(null, Array(5)).map(function (x, i) { return i; }) suteikia masyvą, kurio ilgis yra 5, ir vertės 0,1,2,3,4.

  • Array(5).forEach(alert) nieko nedaro, „ Array.apply(null, Array(5)).forEach(alert)

  • Array.from suteikia mums „ Array.from todėl dabar galite naudoti „ Array.from(Array(5)).forEach(alert)

  • Jei norite inicijuoti tam tikrą vertę, tai naudinga žinoti ...
    Array.from('abcde') , Array.from('x'.repeat(5))
    arba Array.from({length: 5}, (v, i) => i)//gives [0, 1, 2, 3, 4]

border=0
371
19 февр. Atsakymą pateikė Ruben Stolk , vasario 19 d. 2015-02-19 08:41 '15 8:41 val. 2015-02-19 08:41

Su ES2015 .fill() dabar galite tiesiog padaryti:

 // '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) 

Kuris yra daug glaustesnis už Array.apply(0, new Array(n)).map(i => value)

Galite ištrinti 0 .fill() ir paleisti be argumentų, kurie užpildys masyvą su undefined . (Tačiau spausdintuvu tai nepavyks)

151
Atsakymą pateikia AP. 2017-03-01 21:24 Kovo 01 '17, 21:24 2017-03-01 21:24

Trumpiausias:

 [...Array(1000)] 
40
21 дек. Michael Mammoliti atsakymas gruodžio 21 d 2017-12-21 19:46 '17, 7:46 pm 2017-12-21 19:46

Array.from reiškia „ Array.from kuris leidžia sukurti „ Array iš bet kokių „masyvo“ arba „ iterable“ objektų:

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

Tokiu atveju {length: 10} reiškia minimalų „masyvo“ objekto apibrėžimą: tuščią objektą, turintį tik length nuosavybę.

Array.from leidžia naudoti antrąjį argumentą, kad būtų rodomas gautas masyvas.

23
10 янв. Atsakymas, kurį pateikė Alexander Shutov 10 sausis 2018-01-10 19:19 '18, 19:19, 2018-01-10 19:19

Tai inicijuos ilgio nuosavybę į 4:

 var x = [,,,,]; 
20
31 янв. Šime Vido atsakymas sausio 31 d 2011-01-31 17:35 '11, 17:35, 2011-01-31 17:35
 [...Array(6)].map(x=>0); // [0, 0, 0, 0, 0, 0] 

Arba tas pats

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

Arba tas pats

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

(rašomoji mašina saugi)


Nested Arrays kūrimas

Kurdami 2D masyvą su fill intuityviai turėtumėte kurti naujus atvejus. Bet kas iš tikrųjų atsitiko, ta pati masyvas bus išsaugotas kaip nuoroda.

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

Sprendimas

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

Taigi 3x2 masyvas atrodys panašus:

 [...Array(3)].map(x=>Array(2).fill(0)); // [ [0,0] , // [0,0] , // [0,0] ] 
20
09 апр. Atsakymas pateiktas Vlad 09 balandžio. 2018-04-09 14:42 '18, 14:42 pm 2018-04-09 14:42

Esu nustebęs, kad nebuvo pasiūlyta jokio funkcinio sprendimo, kuris leistų nurodyti ilgį vienoje eilutėje. Toliau pateikiama informacija apie „UnderscoreJS“:

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

Dėl pirmiau minėtų priežasčių vengčiau to daryti, jei nenorėjau inicijuoti masyvo konkrečiai vertei. Įdomu pažymėti, kad yra ir kitų bibliotekų, kurios įgyvendina diapazoną, įskaitant „Lo-dash“ ir „Lazy“, kurios gali turėti skirtingas veiklos charakteristikas.

15
23 апр. Christang pateikė atsakymą balandžio 23 d 2014-04-23 07:31 '14, 7:31 am 2014-04-23 07:31

(tikriausiai tai buvo geresnis nei komentaras, bet per ilgas)

Taigi, perskaičius šį klausimą, buvau smalsu, ar iš anksto pasirinkta buvo greičiau, nes teoriškai tai turėtų būti. Tačiau šis tinklaraštis davė keletą patarimų prieš jį http://www.html5rocks.com/en/tutorials/speed/v8/ .

Taigi, vis dar nežinote, aš jį išbandžiau. Ir, kaip paaiškėjo, iš tikrųjų tai yra lėčiau.

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

Šis kodas suteikia keletą po kelių atsitiktinių veiksmų:

 $ 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 февр. atsakymas duotas j03m 26 vasaris 2014-02-26 17:25 '14, 17:25 2014-02-26 17:25
 var arr=[]; arr[5]=0; alert("length="+arr.length); // gives 6 
5
28 апр. vartotojo1067305 atsakymas 28 Bal 2014-04-28 02:27 '14, 2:27 2014-04-28 02:27

Čia yra dar vienas sprendimas.

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

Pirmasis apply() argumentas apply() yra šio objekto rišimas, kurio nerūpi čia, todėl jį nustatėme null .

Array.apply(..) skambina „ Array(..) funkcija ir išplečia objekto { length: 3 } vertę kaip savo argumentus.

4
31 дек. Atsakymas pateikiamas gruodžio 31 d. 2015-12-31 05:01 '16 at 5:01 AM 2015-12-31 05:01

Prašau, žmonės dar nesiduoda savo senų įpročių. Skirtumas tarp atminties skyrimo yra didelis skirtumas, tada dirbant su įrašais šiame masyve (kaip ir senojoje), ir platinant jį pakartotinai, kai masyvas auga (tai yra neišvengiama, ką sistema daro po gaubtu su kitais siūlomais metodais)

Žinoma, visa tai nesvarbu, kol nenorite kažką atvėsti su didelėmis matricomis. Tada jis yra.

Kadangi vis dar nėra galimybės nustatyti pradinio masyvo talpos JS, naudoju šiuos ...

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

Yra kompromisų:

  • Šis metodas užima tiek daug laiko, kiek kiti, kad būtų galima skambinti pirmojo funkcijų skambučiu, bet labai mažai laiko vėlesniems skambučiams (nebent prašoma didesnio masyvo).
  • standard masyvas nuolat rezervuoja tiek pat vietos, kiek didžiausių masyvo užklausų.

Bet jei ji sutinka su tuo, ką darote, ji gali atsiskaityti. Neoficialūs terminai

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

gana greitai (apie 50 ms 10 000, atsižvelgiant į tai, kad kai n = 1,000,000 užtruko apie 5 sekundes), ir

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

daugiau nei minutę (apie 90 sekundžių 10 000 tame pačiame chromo konsolėje arba apie 2000 kartų lėčiau). Tai bus ne tik platinimas, bet ir 10 000 paspaudimų ant ciklo ir tt

3
02 марта '16 в 13:02 2016-03-02 13:02 atsakymas duotas 02 kovo 16 d. 13:02 2016-03-02 13:02

Masyvo konstruktorius turi dviprasmišką sintaksę , o JSLint tiesiog skauda jūsų jausmus.

Be to, jūsų pavyzdžio kodas yra pažeistas, antrasis var operatorius padidins SyntaxError vertę. Jūs nustatote test masyvo length savybę, todėl nereikia kito var .

Kalbant apie savo parinktis, array.length yra vienintelis „švarus“. Kyla klausimas, kodėl pirmiausia reikia nustatyti dydį? Pabandykite pertvarkyti savo kodą, kad atsikratytumėte šios priklausomybės.

2
31 янв. Ivo Wetzel atsakymas, pateiktas sausio 31 d 2011-01-31 17:34 '11 at 17:34 pm 2011-01-31 17:34

Priežastį, kodėl neturėtumėte naudoti new Array , parodo šis kodas:

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

Kitu kodu gali būti sugadintas „Array“ kintamasis. Žinau, kad tai šiek tiek toli nuo to, ką kažkas parašys, bet vis dėlto ...

Be to, kaip sakė Felix King, sąsaja yra šiek tiek nenuosekli ir gali sukelti labai sudėtingų klaidų.

Jei jums reikia masyvo, kurio ilgis = x, užpildytas neapibrėžtu (kaip tai darytų new Array(x) ), galite tai padaryti:

 var x = 4; var myArray = []; myArray[x - 1] = undefined; alert(myArray.length); // 4 
0
31 янв. atsakymas duotas nickf sausio 31 d 2011-01-31 17:34 '11 at 17:34 pm 2011-01-31 17:34

Darant prielaidą, kad matricos ilgis yra pastovus. „Javascript“ tai yra tai, ką mes darome:

const intialArray = new Array(specify the value);

0
23 дек. atsakymas, kurį pateikė mohan babu 23 d 2018-12-23 06:00 '18 6:00 2018-12-23 06:00

Kaip paaiškinta pirmiau, naudojant new Array(size) šiek tiek pavojinga. Užuot naudoję jį tiesiogiai, įdėkite jį į „masyvo kūrėjo funkciją“. Jūs galite lengvai įsitikinti, kad ši funkcija nėra prieinama, ir vengiate pavojaus tiesiogiai skambinti new Array(size) . Be to, galite suteikti jai pasirinktinę pradinę numatytąją vertę. Ši funkcija „ createArray veikia taip:

 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 янв. atsakymas duotas Domi 04 jan. 2014-01-04 14:53 '14, 14:53, 2014-01-04 14:53

Masyvo ilgį galite nustatyti naudodami array.length = youValue

Taigi tai bus

 var myArray = []; myArray.length = yourValue; 
-2
09 июня '17 в 22:33 2017-06-09 22:33 atsakymą pateikė „ ajoposor“ birželio 09 d. 17 val. 10:33 2017-06-06 22:33

Kiti klausimai apie „ žymų arba „ Užduoti klausimą“