1… N අඩංගු අරාවක් නිර්මාණය කරන්නේ කෙසේද?


1200

ධාවන වේලාවේදී N පමණක් දන්නා තැනක සිට 1 සිට N දක්වා ජාවාස්ක්‍රිප්ට් අරා නිර්මාණය කිරීම සඳහා මම පහත විකල්පයන් සොයමි.

var foo = [];

for (var i = 1; i <= N; i++) {
   foo.push(i);
}

මට එය දැනෙන්නේ ලූපයක් නොමැතිව මෙය කිරීමට ක්‍රමයක් තිබිය යුතු බවයි.


233
මෙම සම්පූර්ණ පිටුව කියවීමෙන් පසුව, මම නිගමනය කළේ ඔබේම සරල ලූපය සරලම, වඩාත්ම කියවිය හැකි සහ අවම වශයෙන් දෝෂ සහිත විය හැකි බවයි.
කොකොඩොකෝ

යමෙකුට වඩා දියුණු යමක් අවශ්‍ය නම්, මම අංක, අකුරු, negative / ධනාත්මක පරාස ආදිය සඳහා මෙය කරන node.js lib එකක් නිර්මාණය කළෙමි . Github.com/jonschlinkert/fill-range . එය වරහන් පුළුල් කිරීම සඳහා github.com/jonschlinkert/braces සහ ගෝලීය රටා සඳහා github.com/jonschlinkert/micromatch හි භාවිතා වේ
jonschlinkert

1
"... 1 ... N අඩංගු" වෙනුවට "දිග N ශ්‍රේණියක් සාදා ගන්නේ කෙසේද" යැයි පැවසීමට ඔබ සංස්කරණය කළ යුතුය, දෙවැන්නෙන් ඇඟවෙන්නේ 1 සිට N දක්වා අගයන් සහිත මූලද්‍රව්‍යයන් ඇති බවයි
ස්ටීවන් ලෑන්ඩෝ

7
OPStevenLandow OP නැවත නම් කළ යුත්තේ ඇයි? ඔහුට සාරධර්ම සහිත පෙළක් 1 ... Nඅවශ්‍යද?
ඇන්ඩ්‍රේ එල්රිකෝ

හොඳ ප්‍රශ්නයක්, හොඳ මාතෘකාවක්, (තරමක්) මෝඩ පිළිතුරු.
බිටර්බ්ලූ

Answers:


397

ඔබ පසුව ඇති දේ මට ලැබුනේ නම්, ඔබට පසුව සංඛ්‍යා 1..nලකුණක් අවශ්‍ය වේ.

ඔබට අවශ්‍ය වන්නේ මෙය නම්, ඒ වෙනුවට ඔබට මෙය කළ හැකිද?

var foo = new Array(45); // create an empty array with length 45

ඔබට එය භාවිතා කිරීමට අවශ්‍ය වූ විට ... (ප්‍රශස්තිකරණය නොකළ, උදාහරණයක් ලෙස)

for(var i = 0; i < foo.length; i++){
  document.write('Item: ' + (i + 1) + ' of ' + foo.length + '<br/>'); 
}

උදා: ඔබට ගබඩා කිරීමට අවශ්‍ය නැතිනම් අරාවෙහි කිසිවක් , ඔබට අවශ්‍ය වන්නේ නිවැරදි දිගකින් යුත් කන්ටේනරයක් ඔබට නැවත නැවත කළ හැකි ... මෙය පහසු විය හැකිය.

එය ක්‍රියාවෙන් බලන්න: http://jsfiddle.net/3kcvm/


4
මගේ ප්‍රශ්නය මට හැකි ප්‍රමාණයට වඩා හොඳින් වාක්‍ය ඛණ්ඩනය කිරීමට ඔබ සමත් වූවා නම්, ඔබ ඇත්ත වශයෙන්ම නිවැරදි ලෙස පිළිබිඹු කරන විට මට අවශ්‍ය වන්නේ මට පසුව ලූප කළ හැකි සංඛ්‍යා සමූහයකි :) ඔබේ පිළිතුරට ස්තූතියි.
ගොඩ්ඩර්ස්

151
Od ගොඩර්ස්: ඔබ සොයන්නේ මෙය නම්, ඔබට අරාවක් අවශ්‍ය වන්නේ ඇයි? සරල var n = 45;හා පසුව ලූප කිරීම 1..nසිදු කරයි.
casablanca

3
Od ගොඩර්ස් - මතක තබා ගත යුතු කරුණක් නම්, අරාවෙහි දිග M දක්වා නිර්මාණය කිරීමෙන් පසුව එහි ප්‍රමාණය අඩු කිරීමට ඔබට අවශ්‍ය නම්, සරලව භාවිතා කරන්න foo.length = M--- කපා දැමූ තොරතුරු නැති වී යයි. එය ක්‍රියාවෙන් බලන්න ==> jsfiddle.net/ACMXp
පීටර් අජ්තායි

26
මට ඇත්තටම තේරෙන්නේ නැහැ ඇයි මේ උත්තරය උඩු යටිකුරු කරන්නේ කියලා ... විශේෂයෙන් ම OP විසින්ම එකඟ වූ විට ඉහත අදහස් කිහිපයකින් එය අර්ථවත් නොවේ var n = 45;.
plalx

75
c ස්කන්ලිෆ්: කරුණාකර සටහන් කරන්න, new Array(45);එය "මූලද්‍රව්‍ය 45 අරාවක් නිර්මාණය නොකරයි" (අර්ථයෙන් සමාන වේ [undefined,undefined,..undefined]). එය "දිග = 45 සහිත හිස් අරාවක් නිර්මාණය කරයි" ( [undefined x 45]), සමාන වේ var foo = []; foo.length=45;. ඒ නිසා forEach, සහ mapමෙම නඩුවේ අදාළ නොවේ.
tomalec

1434

ES6 හි () සහ යතුරු () ක්‍රම වලින් අරාව භාවිතා කිරීම.

Array.from(Array(10).keys())
//=> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

පැතිරුම් ක්‍රියාකරු භාවිතා කරමින් කෙටි අනුවාදය .

[...Array(10).keys()]
//=> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

() සිට සිතියම් ශ්‍රිතය අරාව වෙත යොමු කිරීමෙන් 1 සිට ආරම්භ කරන්න

Array.from(Array(10), (_, i) => i + 1)
//=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

79
සටහනක් පමණක්, මෙය සැමවිටම 0 න් ආරම්භ වේ. (1) සිට ආරම්භ mapකිරීම සඳහා අගයන් සකස් කිරීම සඳහා අරාවකට දම්වැලක් දැමිය යුතුය[...Array(10).keys()].map(x => x++);
ස්ටර්ලිං ආචර්

34
යන්තම් වෙනස් map(x => x++)කිරීමට map(x => ++x)මුල් තැන වැටුප් වර්ධක නිසා වටිනාකම ආපසු :) පසුව සිදු වන්නේ
බ්රොක්

99
එර් මොකක්ද!? mapඔබට සරලව හැකි විට ඇයි slice? [...Array(N+1).keys()].slice(1)
රොබින්

19
නැතහොත් භාවිතා නොකර keys1 සිතියම ->Array.from(Array(10)).map((e,i)=>i+1)
yonatanmn

61
නැතහොත් යතුරු සහ සිතියම් භාවිතා නොකර සිතියම්කරණ ශ්‍රිතයක් වෙත යොමු කරන්නfrom Array.from(Array(10), (e,i)=>i+1)
ෆේබියෝ ඇන්ටියුන්ස්

846

ඔබට එසේ කළ හැකිය:

var N = 10; 
Array.apply(null, {length: N}).map(Number.call, Number)

ප්‍රති result ලය: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

හෝ අහඹු අගයන් සමඟ:

Array.apply(null, {length: N}).map(Function.call, Math.random)

ප්‍රති result ලය: [0.7082694901619107, 0.9572225909214467, 0.8586748542729765, 0.8653848143294454, 0.008339877473190427, 0.9911756622605026, 0.8133423360995948, 0.83775885535785535785580585535785535785535785535

පැහැදිලි කිරීම

පළමුව, මේ ලිපිය Number.call(undefined, N)හා සමාන වේ Number(N)කරන පමණක් ප්රතිලාභ, N. අපි පසුව එම කරුණ භාවිතා කරමු.

Array.apply(null, [undefined, undefined, undefined])ට සමාන Array(undefined, undefined, undefined)වන අතර එය මූලද්‍රව්‍ය තුනක අරාවක් නිපදවන අතර undefinedඑක් එක් මූලද්‍රව්‍යයට පවරයි .

N මූලද්‍රව්‍යයන්ට එය සාමාන්‍යකරණය කරන්නේ කෙසේද? Array()ක්‍රියා කරන ආකාරය සලකා බලන්න , එය මේ වගේ දෙයක් වේ:

function Array() {
    if ( arguments.length == 1 &&
         'number' === typeof arguments[0] &&
         arguments[0] >= 0 && arguments &&
         arguments[0] < 1 << 32 ) {
        return [  ];  // array of length arguments[0], generated by native code
    }
    var a = [];
    for (var i = 0; i < arguments.length; i++) {
        a.push(arguments[i]);
    }
    return a;
}

ECMAScript 5 සිට , Function.prototype.apply(thisArg, argsArray)තාරා-ටයිප් කළ අරාව වැනි වස්තුවක් එහි දෙවන පරාමිතිය ලෙස පිළිගනී. අපි ආයාචනා කළහොත් Array.apply(null, { length: N })එය ක්‍රියාත්මක වේ

function Array() {
    var a = [];
    for (var i = 0; i < /* arguments.length = */ N; i++) {
        a.push(/* arguments[i] = */ undefined);
    }
    return a;
}

දැන් අපට N -element array එකක් ඇත, සෑම මූලද්‍රව්‍යයක්ම සකසා ඇත undefined. අපි .map(callback, thisArg)එය ඉල්ලා සිටින විට, එක් එක් මූලද්රව්යයේ ප්රති .ලයට සැකසෙනු ඇත callback.call(thisArg, element, index, array). එමනිසා, [undefined, undefined, …, undefined].map(Number.call, Number)එක් එක් මූලද්‍රව්‍යය සිතියම් ගත (Number.call).call(Number, undefined, index, array)කරනු ඇත Number.call(undefined, index, array), එය අප කලින් නිරීක්ෂණය කළ පරිදි ඇගයීමට සමාන වේindex . එමඟින් මූලද්‍රව්‍ය ඒවායේ දර්ශකයට සමාන වන අරාව සම්පූර්ණ කරයි.

Array.apply(null, {length: N})සාධාරණ වෙනුවට කරදරයෙන් මිදෙන්නේ ඇයි Array(N)? සියල්ලට පසු, ප්‍රකාශන දෙකෙහිම ප්‍රති -ලය වනුයේ නිර්වචනය නොකළ මූලද්‍රව්‍යයන්ගේ N- මූලද්‍රව්‍ය සමූහයකි. මෙහි ඇති වෙනස වන්නේ හිටපු ප්රකාශනය තුළ, එක් එක් මූලද්රව්යය සුවිශේෂව බව ය සකස් නිර්වචනය නොකළ කිරීමට, අග දී, එක් එක් මූලද්රව්යය කවදාවත් නියම කර තිබූ අතර. ප්‍රලේඛනයට අනුව .map():

callbackනියම කර ඇත්තේ අගයන් පවරා ඇති අරාවේ දර්ශක සඳහා පමණි; මකාදැමූ හෝ කිසි විටෙකත් අගයන් පවරා නොමැති දර්ශක සඳහා එය ආයාචනා නොකෙරේ.

එබැවින් Array(N)ප්රමාණවත් නොවේ; Array(N).map(Number.call, Number)එහි ප්‍රති result ලය වනුයේ N හි ආරම්භක නොවන අරාවකි .

අනුකූලතාව

මෙම තාක්ෂණය Function.prototype.apply()ECMAScript 5 හි නිශ්චිතව දක්වා ඇති හැසිරීම මත රඳා පවතින බැවින් , එය ක්‍රෝම් 14 සහ ඉන්ටර්නෙට් එක්ස්ප්ලෝරර් 9 වැනි පූර්ව ECMAScript බ්‍රව්සර් 5 හි ක්‍රියා නොකරනු ඇත .


62
දක්ෂතාවය සඳහා +1 නමුත් කරුණාකර මෙය ලූප සඳහා ප්‍රාථමිකයකට වඩා විශාල ප්‍රමාණයේ ස්ලෝවර් ඇණවුම් බව සලකන්න: jsperf.com/array-magic-vs-for
warpech

7
ඉතා දක්ෂ - බොහෝ විට එසේ විය හැකිය. බව ගසා Function.prototype.callප්රථම param යනු thisකට සෘජුව සිතියම්ගත වස්තුව Array.prototype.mapගේ iterator පරාමිතිය ඒ සඳහා යම් දීප්තිමත් ඇත '' '.
නෝවා ෆ්‍රීටාස්

14
මෙය සැබවින්ම, ඉතා දක්ෂයි (JS අපයෝජනය කිරීමේ මායිම්). මෙහි ඇත්ත වශයෙන්ම වැදගත් තීක්ෂ්ණ බුද්ධිය නම්, mapනියම නොකළ සාරධර්ම පිළිබඳ මුග්ධත්වයයි. තවත් අනුවාදයක් (සහ තරමක් පැහැදිලි වුවත්, දිගු වුවද): Array.apply(null, { length: N }).map(function(element, index) { return index; })
බෙන් රීච්

6
En බෙන්රීච් ඊටත් වඩා හොඳයි (JS අපයෝජන මට්ටම් අනුව): Array.apply(null, new Array(N)).map(function(_,i) { return i; }) හෝ, es6 සහ ඊතල ක්‍රියාකාරිත්වයන් වලදී ඊටත් වඩා කෙටි වේ: Array.apply(null, new Array(N)).map((_,i) => i)
oddy

1
මෙය 1 න් ආරම්භ වන අරාවක් ලබා දෙන්නේ නම්, එය ඇත්ත වශයෙන්ම OP හි ප්‍රශ්නයට පිළිතුරු සපයයි
සරසපරිල්ලා

509

ES6 භාවිතා කරන විවිධ ක්‍රම

පැතිරුම් ක්‍රියාකරු ( ...) සහ යතුරු ක්‍රමය භාවිතා කිරීම

[ ...Array(N).keys() ].map( i => i+1);

පුරවන්න / සිතියම

Array(N).fill().map((_, i) => i+1);

අරාව

Array.from(Array(N), (_, i) => i+1)

Array.from සහ { length: N }හැක්

Array.from({ length: N }, (_, i) => i+1)

සාමාන්‍යකරණය කළ පෝරමය පිළිබඳ සටහන

හැකි නිෂ්පාදන පෙලගැස්මක් ඉහත සියලු ආකාර එච්චරමයි ඕනෑම වෙනස් කිරීම මගින් අගයන් අවශ්ය කිරීමට initialised i+1අවශ්ය ප්රකාශනය කිරීමට (උදා: i*2, -i, 1+i*2, i%2හා ආදිය). කිසියම් ශ්‍රිතයකින් ප්‍රකාශනය ප්‍රකාශ කළ හැකි fනම් පළමු ස්වරූපය සරලව පෙනේ

[ ...Array(N).keys() ].map(f)

උදාහරණ:

Array.from({length: 5}, (v, k) => k+1); 
// [1,2,3,4,5]

අරාව undefinedඑක් එක් ස්ථානය සමඟ ආරම්භ කර ඇති බැවින් , එහි අගයv වනු ඇතundefined

සියලු ආකාර පෙන්වන උදාහරණය

අභිරුචි ආරම්භක ශ්‍රිතය සමඟ වඩාත් සාමාන්‍ය උදාහරණය fඑනම්

[ ...Array(N).keys() ].map((i) => f(i))

හෝ ඊටත් වඩා සරලයි

[ ...Array(N).keys() ].map(f)


37
හොඳම පිළිතුර IMHO. මෙයද බලන්න developer.mozilla.org/de/docs/Web/JavaScript/Reference/...
le_m

5
0 සිට ආරම්භ වන අරා සඳහා k ++ භාවිතා කරන්න
Borgboy

2
ඔබට වැඩි කිරීමට අවශ්‍ය නම් k++, භාවිතා නොකරන්න , භාවිතා කරන්න ++k.
ඇලෙක්ස්

4
පරෙස්සම් වන්න Array.from ඔබ බහු-පුරවන තුරු IE හි සහය නොදක්වයි.
ලෝරන්

3
ටීඑස් සම්පාදකයා සතුටු කිරීම සඳහා භාවිතයට නොගත් පරාමිතිය ලොඩාෂ් සමඟ ප්‍රතිස්ථාපනය කිරීම ගැන සලකා බලන්න: Array.from ({length: 5}, (_, k) => k + 1);
Journeycorner

312

අරා සහජයෙන්ම ඒවායේ දිග කළමනාකරණය කරයි. ඒවා ගමන් කරන විට, ඒවායේ දර්ශක මතකයේ තබාගෙන එම අවස්ථාවේදී යොමු කළ හැකිය. අහඹු දර්ශකයක් දැන ගැනීමට අවශ්‍ය නම්, indexOfක්‍රමය භාවිතා කළ හැකිය.


මෙය ඔබගේ අවශ්‍යතා සඳහා යම් ප්‍රමාණයක පෙළක් ප්‍රකාශ කිරීමට අවශ්‍ය විය හැකිය:

var foo = new Array(N);   // where N is a positive integer

/* this will create an array of size, N, primarily for memory allocation, 
   but does not create any defined values

   foo.length                                // size of Array
   foo[ Math.floor(foo.length/2) ] = 'value' // places value in the middle of the array
*/


ES6

බෝ වීම

පැතිරීමේ ක්‍රියාකරු ( ...) සහ keysක්‍රමය භාවිතා කිරීමෙන්, දර්ශක නිපදවීම සඳහා තාවකාලික N ප්‍රමාණයේ ශ්‍රේණියක් නිර්මාණය කිරීමට ඔබට හැකි වන අතර, පසුව ඔබේ විචල්‍යයට පැවරිය හැකි නව අරාවක්:

var foo = [ ...Array(N).keys() ];

පුරවන්න / සිතියම

ඔබට මුලින්ම ඔබට අවශ්‍ය අරාවෙහි ප්‍රමාණය සෑදිය හැකිය, එය නිර්වචනය නොකළ ඒවා පුරවා නව අරාවක් භාවිතා mapකර එක් එක් මූලද්‍රව්‍ය දර්ශකයට සකසයි.

var foo = Array(N).fill().map((v,i)=>i);

අරාව

මෙය N ප්‍රමාණයේ දිගට ආරම්භ කිරීම සහ අරාව එක් වර්‍ගයක ජනගහනය කිරීම විය යුතුය.

Array.from({ length: N }, (v, i) => i)



අදහස් හා ව්‍යාකූලත්වය වෙනුවට, ඉහත උදාහරණ වල 1..N වෙතින් අගයන් ග්‍රහණය කර ගැනීමට ඔබට සැබවින්ම අවශ්‍ය නම්, විකල්ප කිහිපයක් තිබේ:

  1. දර්ශකය තිබේ නම්, ඔබට එය එකකින් වැඩි කළ හැකිය (උදා:) ++i.
  2. දර්ශකය භාවිතා නොකරන අවස්ථාවන්හිදී - සහ වඩාත් කාර්යක්ෂම ක්‍රමයක් - ඔබේ අරාව නිර්මාණය කිරීම, නමුත් N N + 1 නිරූපණය කිරීම, ඉන්පසු ඉදිරිපසින් මාරුවීම.

    එබැවින් ඔබ අංක 100 ක් කැමති නම්:

    let arr; (arr=[ ...Array(101).keys() ]).shift()





ලැබීමේ අවසානයේ සැකසිය නොහැකි දත්ත සඳහා සංඛ්‍යා පෙළ භාවිතා කරන විට මෙය ප්‍රයෝජනවත් යැයි මම විශ්වාස කරමි. (අගයන් ප්‍රතිස්ථාපනය කරන HTML අච්චුවක් මෙන්.)
නීල් මොන්රෝ

යමෙකු මෙය කරන්නේ ඇයිද යන්න පතන ලැයිස්තුවක් ජනගහනය කිරීම සඳහා සංඛ්‍යා මාලාවක් තිබීම, පරිශීලකයාට 1 සිට 10 දක්වා තේරීමක් ලබා දෙයි. අතින් කුඩා අරා [1,2,3 ... 10] තේරුමක් ඇත, නමුත් කුමක් නම් එය 1 සිට 50 දක්වාද? අවසාන අංකය වෙනස් වුවහොත් කුමක් කළ යුතුද?
සිගර්ඩෝග්

Ig සිගාර්ඩෝග් භාවිතා කරන පෙට්ටියක් ඇති බවට මට සැක නැත, නමුත් මගේ අනුමානය එය කුඩා ය. සංඛ්‍යා සමූහයක් අවශ්‍ය වන්නේ ඇයි, සාමාන්‍යයෙන් අරාව හරහා නැවත යෙදෙන විට දර්ශකයක් ලූප ඉදිකිරීමේ කොටසක් ලෙස භාවිතා කරනු ඇත - එක්කෝ ලූප ශරීර ක්‍රියාකාරිත්වයට තර්කයක් ලෙස හෝ ප්‍රති විචල්‍යයක් ලෙස - එබැවින් සංඛ්‍යා පෙළක් රඳවා ගැනීම සුළුපටු නොවේ නිශ්චිත පළල අරාවක් සෑදීම සඳහා, හෝ අරාවෙහි ඉහළ මායිම රඳවා ඇති විචල්‍යයක් පමණි. භාවිත අවස්ථා කිහිපයක් ගැන මට සිතිය හැකිය, නමුත් ඒ කිසිවක් OP
vol7ron

5
මා කීවාක් මෙන්, මට 1 සිට 10 දක්වා සංඛ්‍යා සමඟ ඩ්‍රොප් ඩවුන් එකක් ජනනය කළ යුතුය. මගේ භාවිත කේස් එකක් තිබේ. මම මේ පිටුව සොයාගත්තේ එලෙසයි. ඒ නිසා මම මෙහි දුටු ඕනෑම දෙයකට වඩා අතින් අරා එකක් තැනීම සංකීර්ණ නොවේ. එබැවින් මගේ අවශ්‍යතා OP හි අවශ්‍යතා නොවේ. නමුත් මට මගේ පිළිතුර ඇත.
සිගර්ඩෝග්

1
@ vol7ron භාවිත කේක් එකක් ඇත, මටද එකක් තිබේ. කෝණික, පේජිං වලදී, මට ක්ලික් කළ හැකි පාදකයේ ඇති පිටු පෙන්වීමට අවශ්‍යයි. ඒ නිසා මම * ngFor = "පිටු ගණනක ඉඩ දෙන්න" සමඟ දර්ශනයක මූලද්‍රව්‍ය ලූප කරමි. ඒ සඳහා ඔබට වඩා හොඳ විසඳුමක් තිබේද? BTW, stackoverflow.com/questions/36354325/… බලන්න
ඩලිබෝර්

189

ES6 හි ඔබට කළ හැක්කේ:

Array(N).fill().map((e,i)=>i+1);

http://jsbin.com/molabiluwa/edit?js,console

සංස්කරණය කරන්න: ඔබ ප්‍රශ්නය යාවත්කාලීන කළ දින සිට වෙනස් Array(45)කරන Array(N)ලදි.

console.log(
  Array(45).fill(0).map((e,i)=>i+1)
);


3
+1 එය නරක අනුවාදයට වඩා විශාල O වඩා හොඳ නිසා .join.split- නමුත් මම තවමත් නිහතමානී ලූපය වඩා හොඳ යැයි සිතමි.
රොබින්

මම එකඟ වෙමි ob රොබින් - ඇල්ගොරිතම සංකීර්ණතාව පසෙකට දමා, නිහතමානී පුඩුවක් සෑම විටම වඩා කියවිය හැකි ය. කෙසේ වෙතත්, ජාවා හි ලැම්බඩාස්ගේ පැමිණීමත් සමඟ, මම හිතන්නේ mapඉක්මනින් මේ වගේ දේවල් සඳහා ප්‍රමිතියක් බවට පත්වනු ඇත.
Nate

4
const gen = N => [...(function*(){let i=0;while(i<N)yield i++})()]
රොබින්

8
.fill()අවශ්‍ය වන්නේ ඇයි දැයි මට තේරෙන්නේ නැත . මම නෝඩයේ repl පරීක්‍ෂා කරන විට එය සිදුවන බව මට පෙනේ, නමුත් එතැන් සිට Array(1)[0] === undefined() පිරවීම සඳහා වන ඇමතුමෙහි ඇති වෙනස Array(1).fill(undefined)කුමක්ද?
ඩොමිනික්

11
උනන්දුවක් දක්වන වෙනත් ඕනෑම කෙනෙකුට, අරාව (එන්) සහ අරාව (එන්) අතර වෙනස .ෆිල් () මෙහි
ඩොමිනික්

108

ඉතා ජනප්‍රිය Underscore _.range ක්‍රමය භාවිතා කරන්න

// _.range([start], stop, [step])

_.range(10); // => [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
_.range(1, 11); // => [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
_.range(0, 30, 5); // => [0, 5, 10, 15, 20, 25]
_.range(0, -10, -1); //  => [0, -1, -2, -3, -4, -5, -6, -7, -8, -9]
_.range(0); // => []


නියමයි. කෙසේ වෙතත් අවධාරනය නොකරන විශාල ව්‍යාපෘතියක් මට පෙන්වන්න ...
එරෙස් කොහෙන්

66
function range(start, end) {
    var foo = [];
    for (var i = start; i <= end; i++) {
        foo.push(i);
    }
    return foo;
}

පසුව කැඳවනු ලැබේ

var foo = range(1, 5);

ජාවාස්ක්‍රිප්ට් හි මෙය සිදු කිරීම සඳහා කිසිදු ක්‍රමයක් නොමැත, නමුත් ඔබට එය එක් වරකට වඩා කිරීමට අවශ්‍ය නම් එය නිර්මාණය කිරීම සඳහා පරිපූර්ණ වලංගු උපයෝගීතා කාර්යයකි.

සංස්කරණය කරන්න: මගේ මතය අනුව, පහත දැක්වෙන්නේ වඩා හොඳ පරාසයක ශ්‍රිතයකි. සමහර විට මම ලින්ක් පක්ෂග්‍රාහීව සිටින නිසා විය හැකිය, නමුත් එය තවත් අවස්ථා වලදී වඩාත් ප්‍රයෝජනවත් යැයි මම සිතමි. ඔබගේ සැතපුම් ගණන වෙනස් විය හැකිය.

function range(start, count) {
    if(arguments.length == 1) {
        count = start;
        start = 0;
    }

    var foo = [];
    for (var i = 0; i < count; i++) {
        foo.push(start + i);
    }
    return foo;
}

2
මම මෙයට කැමතියි. ඔබට එය සමඟ අමතර සැතපුමක් යාමට අවශ්‍ය නම්, ඔබට එය Array.prototype.range = ශ්‍රිතය (ආරම්භය, අවසානය) ලෙස ප්‍රකාශ කළ හැකිය {...};. එවිට ඔබට ඕනෑම අරාව වස්තුවක පරාසය (x, y) ඇමතිය හැකිය.
Zach Rattner

8
ඒ වෙනුවට, එහි ක්රමයක් බවට පත් Arrayකරනවා වෙනුවට Array.prototypeසෑම අරාවක් මත මෙම ක්රමය ඇති කිරීමට හේතුවක් (එය පවා වෙනුවට ගොළු සැලකිලිමත් විය හැකි) පවතින බැවින්.
adamse

9
Array.range(1, 5)බොහෝ විට වඩාත් සුදුසු වනු ඇත, නමුත් ලිවීම පිළිබඳ යම් ආකාරයක සිසිල් යමක් [].range(1, 5)තිබේ.
MooGoo

"ඒ වෙනුවට එය Array.prototype වෙනුවට Array ක්‍රමයක් බවට පත් කරන්න" - වෙනස කුමක්ද? ඔබ අදහස් කළේ නිශ්චිත අරාවකට පමණක්ද?
පිලා

3
@pilau ඇඩම්ස් පවසන පරිදි, එය අමුතුයි. එය මූලාකෘතියේ තිබේ නම්, ඔබට පැවසිය හැකිය foo = [1, 2, 3]; bar = foo.range(0, 10);. නමුත් එය හුදෙක් ... ව්‍යාකූලයි. bar = Array.range(0, 10)වඩා පැහැදිලි සහ පැහැදිලි ය. පරාසය නිදසුන සමඟ කිසිදු සම්බන්ධයක් නැත, එබැවින් එය නිදර්ශන ක්‍රමයක් බවට පත් කිරීමට හේතුවක් නැත.
ඉයන් හෙන්රි

53

Arrayv8 පිරවීම සඳහා වේගවත්ම ක්‍රමය නම්:

[...Array(5)].map((_,i) => i);

ප්‍රති result ලය වනු ඇත්තේ: [0, 1, 2, 3, 4]


අමතර විචල්‍යය නොමැතිව එය කිරීමට ක්‍රමයක් තිබේද _
bluejayke

lbluejayke no :(
аlex dykyі

රළු, .map හි ප්‍රභව කේතය කුමක්දැයි ඔබ දන්නවාද? එය ලූපයකට වඩා වේගවත් දැයි මට විශ්වාස නැත, නමුත් එසේ නොවේ නම් න්‍යායාත්මකව අපට ප්‍රොපර්ටි නිර්වචනය කර නව එකක් සාදා ගත හැකිය
බ්ලූජේක්

49

මෙම ප්‍රශ්නයට සංකීර්ණ පිළිතුරු රාශියක් ඇත, නමුත් සරල එක් ලයිනර්:

[...Array(255).keys()].map(x => x + 1)

එසේම, ඉහත ලිවීමට කෙටි (හා පිළිවෙලට) තිබුණද, පහත දැක්වෙන දේ ටිකක් වේගවත් යැයි මම සිතමි (උපරිම දිග සඳහා:

127, Int8,

255, Uint8,

32,767, Int16,

65,535, Uint16,

2,147,483,647, Int32,

4,294,967,295, යූන්ට් 32.

( උපරිම නිඛිල අගයන් මත පදනම්ව ), ටයිප් කළ අරා පිළිබඳ වැඩි විස්තර මෙහි ඇත ):

(new Uint8Array(255)).map(($,i) => i + 1);

මෙම විසඳුම ද එතරම් පරමාදර්ශී නොවුනත්, එය අරා දෙකක් නිර්මාණය කරන අතර අතිරේක විචල්‍ය ප්‍රකාශය "$" භාවිතා කරයි (මෙම ක්‍රමය භාවිතා කර එය වටා යාමට කිසිදු ක්‍රමයක් විශ්වාස නැත). මෙය කළ හැකි නිරපේක්ෂ වේගවත්ම ක්‍රමය පහත දැක්වෙන විසඳුම යැයි මම සිතමි.

for(var i = 0, arr = new Uint8Array(255); i < arr.length; i++) arr[i] = i + 1;

මෙම ප්‍රකාශය කළ පසු ඕනෑම වේලාවක, ඔබට වර්තමාන විෂය පථය තුළ "අර" විචල්‍යය භාවිතා කළ හැකිය;

ඔබට එයින් සරල කාර්යයක් කිරීමට අවශ්‍ය නම් (මූලික සත්‍යාපනය සමඟ):

function range(min, max) {
    min = min && min.constructor == Number ? min : 0;
    !(max && max.constructor == Number && max > min) && // boolean statements can also be used with void return types, like a one-line if statement.
        ((max = min) & (min = 0));  //if there is a "max" argument specified, then first check if its a number and if its graeter than min: if so, stay the same; if not, then consider it as if there is no "max" in the first place, and "max" becomes "min" (and min becomes 0 by default)

    for(var i = 0, arr = new (
        max < 128 ? Int8Array : 
        max < 256 ? Uint8Array :
        max < 32768 ? Int16Array : 
        max < 65536 ? Uint16Array :
        max < 2147483648 ? Int32Array :
        max < 4294967296 ? Uint32Array : 
        Array
    )(max - min); i < arr.length; i++) arr[i] = i + min;
    return arr;
}



//and you can loop through it easily using array methods if you want
range(1,11).forEach(x => console.log(x));

//or if you're used to pythons `for...in` you can do a similar thing with `for...of` if you want the individual values:
for(i of range(2020,2025)) console.log(i);

//or if you really want to use `for..in`, you can, but then you will only be accessing the keys:

for(k in range(25,30)) console.log(k);

console.log(
    range(1,128).constructor.name,
    range(200).constructor.name,
    range(400,900).constructor.name,
    range(33333).constructor.name,
    range(823, 100000).constructor.name,
    range(10,4) // when the "min" argument is greater than the "max", then it just considers it as if there is no "max", and the new max becomes "min", and "min" becomes 0, as if "max" was never even written
);


එබැවින්, ඉහත ශ්‍රිතය සමඟ, ඉහත සුපිරි මන්දගාමී “සරල එක්-ලයිනර්” සුපිරි වේගවත්, ඊටත් වඩා කෙටි වේ:

range(1,14000);

VJVG නමුත් වේගවත් ක්‍රියාකාරිත්වය සඳහා නොවේද?
බ්ලූජේක්

හරියටම හරි. හැමෝම සොයන මේ සරල එක ලයිනර් එක එයයි!
සුපර්සන්

up සුපර්සන් එහි සුපිරි මන්දගාමී වුවද :)
bluejayke

නව fillක්‍රමය සමඟ නවීන ජාවාස්ක්‍රිප්ට් :Array(255).fill(0,0,255)
කැකෝඩර්

accacoder එය කොතරම් වේගවත්ද, එය අරා කීයක් නිර්මාණය කරයිද සහ නැවත නැවත ක්‍රියා කරයිද?
bluejayke

42

ඔබට මෙය භාවිතා කළ හැකිය:

new Array(/*any number which you want*/)
    .join().split(',')
    .map(function(item, index){ return ++index;})

උදාහරණයක් වශයෙන්

new Array(10)
    .join().split(',')
    .map(function(item, index){ return ++index;})

පහත දැක්වෙන අරාව නිර්මාණය කරයි:

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

එසේම, ඇයි නැත්තේ new Array(10).join().split(',').map(function() {return ++arguments[1]});?
අවලංගු ප්‍රධාන

1
Cases සමහර අවස්ථාවන් සඳහා මර්ප්ලයික්ස් JS එන්ජිම මඟින් ප්‍රශස්තිකරණය නොකෙරේ (V8 සඳහා පවා සත්‍ය වේ, jsperf.com/arguments-vs-array-argument/2 බලන්න )
nktssh

4
මෙය සිත්ගන්නාසුලු විසඳුමකි, නමුත් එය මුළුමනින්ම ප්‍රායෝගික නැත - අරාව 3 වතාවක් විග්‍රහ කිරීම (එක් වරක් join, එක් වරක් splitසහ එක් වරක් ඔබට සැබවින්ම කිරීමට අවශ්‍ය දෙය සඳහා) හොඳ නැත - මම දනිමි ඔවුන් අනුග්‍රහයෙන් වැටී ඇති බව පෙනේ කිසියම් හේතුවක් නිසා, නමුත් හොඳ පැරණි තාලයේ ලූපයක් භාවිතා කිරීම වඩා හොඳය !
රොබින්

42

ES6 මෙය උපක්‍රමය කරයි:

[...Array(12).keys()]

ප්‍රති result ලය බලන්න:

[...Array(12).keys()].map(number => console.log(number))


5
ඇත්ත වශයෙන්ම, ඔවුන් ඉල්ලා සිටියේ 1..N මිස 0..N-1 නොවේ
යාකොව්එල්

1
ඔව්, [...Array(N + 1).keys()].slice(1)1..N
ඩේවිඩ් ජී

කිසියම් හේතුවක් නිසා මෙම විසඳුම එක්ස්පෝ (ප්‍රතික්‍රියා-ස්වදේශීය) යෙදුමෙන් නිෂ්පාදන අනුවාදයේ ක්‍රියා නොකරයි. [...Array(N + 1).keys()]මෙම කේතය හිස් අරාවක් ලබා දෙයි, නමුත් නිෂ්පාදන ප්‍රකාරයේදී, සංවර්ධන ප්‍රකාරය භාවිතා කරයි.
FabianoLothor

3
මෙම .keys()පිළිතුර මේ වන විටත් ලබා දී කට පෙර හා upvotes 500+ ඇත. ඔබේ පිළිතුර එයට එකතු කරන්නේ කුමක්ද?
ඩෑන් ඩස්කල්ස්කු

39

මම මෙන් ඔබේ යෙදුමේ ඔබ d3.js භාවිතා කරන්නේ නම් , D3 ඔබට උපකාරක කාර්යයක් සපයයි.

එබැවින් 0 සිට 4 දක්වා අරාවක් ලබා ගැනීම සඳහා එය පහසු ය:

d3.range(5)
[0, 1, 2, 3, 4]

ඔබ ඉල්ලූ පරිදි 1 සිට 5 දක්වා අරාවක් ලබා ගැනීමට:

d3.range(1, 5+1)
[1, 2, 3, 4, 5]

වැඩි විස්තර සඳහා මෙම නිබන්ධනය බලන්න .


මෙම ප්‍රකාශය මට මගේ වර්තමාන ව්‍යාපෘතිය සමඟ වැඩ කරන JS පුස්තකාලය වන රාම්ඩා ජේඑස් හි පරාසය () ශ්‍රිතය සොයා බැලීමේ අදහස ලබා දුන්නේය . පරිපූර්ණ.
මෝෆැටික්

39

ES2015 / ES6 පැතිරුම් ක්‍රියාකරු භාවිතා කිරීම

[...Array(10)].map((_, i) => i + 1)

console.log([...Array(10)].map((_, i) => i + 1))


7
i + 1වඩා අර්ථවත් ++iකරයි.
වින්සන්ට් කැන්ටින්

38

සංඛ්‍යා සමූහයක් ජනනය කිරීමේ වේගවත්ම ක්‍රමය මෙය විය හැකිය

කෙටිම

var a=[],b=N;while(b--)a[b]=b+1;

පෙළට

var arr=(function(a,b){while(a--)b[a]=a;return b})(10,[]);
//arr=[0,1,2,3,4,5,6,7,8,9]

ඔබට 1 සිට ආරම්භ කිරීමට අවශ්‍ය නම්

var arr=(function(a,b){while(a--)b[a]=a+1;return b})(10,[]);
//arr=[1,2,3,4,5,6,7,8,9,10]

ශ්‍රිතයක් අවශ්‍යද?

function range(a,b,c){c=[];while(a--)c[a]=a+b;return c}; //length,start,placeholder
var arr=range(10,5);
//arr=[5,6,7,8,9,10,11,12,13,14]

ඇයි?

  1. while වේගවත්ම ලූපයයි

  2. සෘජු සැකසුම වඩා වේගවත් ය push

  3. [] වඩා වේගවත් new Array(10)

  4. එය කෙටි ... පළමු කේතය බලන්න. ඉන්පසු මෙහි ඇති අනෙකුත් සියලුම කාර්යයන් දෙස බලන්න.

ඔයා නැතුව ජීවත් වෙන්න බෑ වගේ නම් සඳහා

for(var a=[],b=7;b>0;a[--b]=b+1); //a=[1,2,3,4,5,6,7]

හෝ

for(var a=[],b=7;b--;a[b]=b+1); //a=[1,2,3,4,5,6,7]

8
මෙම හිමිකම් මිණුම් සලකුණු සමඟ උපස්ථ කිරීම වඩා හොඳය. Jsperf.com උත්සාහ කරන්න .
මැට් බෝල්

2
lol jsperf ... pls මැට් ඔබ මගේ පිළිතුරට කැමති නැති නිසා මගේ අනෙක් අය පහත් කොට සැලකීම නවත්වන්න ... stackoverflow.com/a/18344296/2450730 ... console.time () භාවිතා කරන්න හෝ එය හඳුන්වන්නේ කෙසේද ... NOT jsperf .
කොකෝ

4
FYI: මීට වසර කිහිපයකට පෙර ජෝන් රයිසිග් ප්‍රථම වරට ප්‍රකාශයට පත් කළ පරිදි - සමහර වේදිකාවල (කවුළු: P යන්නෙහි තේරුම) බ්‍රව්සරයට සෑම මිනිත්තු 16 කට වරක් කාලය ලබා දෙනු ලැබේ. බහු කාර්ය පරිසරයන්හි ක්‍රියාත්මක කිරීමේ කාලය මැනීමේදී වෙනත් ගැටළු ද ඇත. jsperf.com විසින් සංඛ්‍යාත්මකව නිවැරදි වන පරිදි පරීක්ෂණ ක්‍රියාත්මක කර ඇත. console.time()ප්‍රතිභානයක් ලබා ගැනීම සඳහා ධාවනය කිරීම කමක් නැත , නමුත් සාක්ෂියක් සඳහා ඔබට jsperf.com අවශ්‍ය වන අතර එය වෙනත් පුද්ගලයින්ගෙන් (විවිධ දෘඩාංග ආදිය) හරස් බ්‍රව්සර්
ප්‍රති results ල පෙන්වයි

3
ocococco මෙය වැරදියි:var a=[],b=N;while(b--){a[b]=a+1};
vintagexav

5
@ cocco- අතර නොවේ සෑම විටම වේගයෙන් වෙනත් වළළු වඩා. සමහර බ්‍රව්සර් වල, අඩු වන අතර ලූපයක් ලූපයකට වඩා මන්දගාමී වේ, ඔබට ජාවාස්ක්‍රිප්ට් ක්‍රියාකාරිත්වය පිළිබඳ සාමාන්‍ය ප්‍රකාශ කළ නොහැක, මන්ද විවිධාකාර ප්‍රශස්තිකරණයන් සමඟ බොහෝ ක්‍රියාත්මක කිරීම් ඇති බැවිනි. කෙසේ වෙතත්, පොදුවේ මම ඔබේ ප්රවේශයට කැමතියි. ;-)
RobG

32

ඔබ lodash භාවිතා කරන්නේ නම්, ඔබ භාවිතා කළ හැකිය _.range :

_.range([start=0], end, [step=1])

ආරම්භයේ සිට අවසානය දක්වා ඉදිරියට යන නමුත් සංඛ්‍යා ඇතුළත් (ධනාත්මක සහ / හෝ negative ණ) සංඛ්‍යා සමූහයක් නිර්මාණය කරයි. අවසානයක් හෝ පියවරක් නොමැතිව සෘණ ආරම්භයක් නියම කර ඇත්නම් -1 පියවරක් භාවිතා වේ. අවසානය නිශ්චිතව දක්වා නොමැති නම්, එය ආරම්භයෙන් ආරම්භ කර 0 ලෙස සකසා ඇත.

උදාහරණ:

_.range(4);
// ➜ [0, 1, 2, 3]

_.range(-4);
// ➜ [0, -1, -2, -3]

_.range(1, 5);
// ➜ [1, 2, 3, 4]

_.range(0, 20, 5);
// ➜ [0, 5, 10, 15]

_.range(0, -4, -1);
// ➜ [0, -1, -2, -3]

_.range(1, 4, 0);
// ➜ [1, 1, 1]

_.range(0);
// ➜ []

ඒක ලොකු ලොකුයිif
බ්ලූජේක්

32

පිරවීම සඳහා නව ක්‍රමය Array:

const array = [...Array(5).keys()]
console.log(array)

ප්‍රති result ලය වනු ඇත්තේ: [0, 1, 2, 3, 4]


මෙය ඇත්තෙන්ම හොඳ පිළිතුරකි, තාක්‍ෂණිකව ප්‍රශ්නය 1-එන් සිට නොව 0- (එන් -1)
බ්ලූජේක්

31

ES6 සමඟ ඔබට කළ හැක්කේ:

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

අරාවෙහි අගයන් සැබවින්ම මෙම විසඳුම භාවිතයෙන් පුරවා ඇති mapඅතර එය forEachක්‍රියාත්මක වනු ඇත.
dontmentionthebackup

28

අවසාන සාරාංශ වාර්තාව .. Drrruummm Rolll -

මේ වන කෙටිම කේතය ප්රමාණය එන් (මෙහි 10) ක Array උත්පාදනය කිරීමට ES6 භාවිතා නොකර . ඉහත කොකෝගේ අනුවාදය සමීප නමුත් කෙටිම නොවේ.

(function(n){for(a=[];n--;a[n]=n+1);return a})(10)

නමුත් මෙම කේත ගොල්ෆ් ක්‍රීඩාවේ අවිවාදිත ජයග්‍රාහකයා (ප්‍රභව කේතයේ අවම බයිට් කිහිපයකින් විශේෂිත ගැටළුවක් විසඳීමේ තරගය) නිකෝ රූට්සාලයිනන් ය . Array Constructor සහ ES6 පැතිරුම් ක්‍රියාකරු භාවිතා කිරීම . (බොහෝ ES6 සින්ටැක්ස් වලංගු ටයිප් ස්ක්‍රිප්ට් වේ, නමුත් පහත දැක්වෙන්නේ නැත. එබැවින් එය භාවිතා කරන විට විනිශ්චය කරන්න)

[...Array(10).keys()]

ඡන්දය අඩු කරන්නේ ඇයි? දිගු පිළිතුරු ලැයිස්තුව අනුගමනය කිරීම අසීරු බැවින් සාරාංශ කිරීමට සිතන්න.
sapy

මෙය 0-10 නොවේද? [... අරා (10) .කයිස් ()]
ග්‍රෙග්

වෙබ්ස්ටෝම් යෝජනා කරයි (නව අරාව (10)) යතුරු (), එය හරිද?
ගයි

(නව අරාව (10)) යතුරු (), ආපසු අරාවඉටරේටරය return} ලබා දෙයි, අරාව නොවේ
sapy

මෙය ගෝලීය විචල්‍යයක් නිර්මාණය කරයි a. ලූපය විය යුතුයfor(var a=[];n--;a[n]=n+1)
kube

21

එහි භාවිතා ES6 තවත් ක්රමයකි Array.from 2 තර්ක කාලයක් ගතවේ, පළමු වන arrayLike (මෙම නඩුවේ වස්තුවක් lengthදේපල), දෙවැන්නා සිතියම් ශ්රිතයක් වේ (මෙම අවස්ථාවේදී අපි එහි දර්ශකය අයිතමය සිතියම්ගත)

Array.from({length:10}, (v,i) => i)

මෙය කෙටි වන අතර ඉරට්ටේ සංඛ්‍යා උත්පාදනය වැනි වෙනත් අනුක්‍රම සඳහා භාවිතා කළ හැකිය

Array.from({length:10}, (v,i) => i*2)

මෙය වෙනත් බොහෝ ක්‍රමවලට වඩා හොඳ කාර්ය සාධනයක් ඇති බැවින් එය අරාව හරහා එක් වරක් පමණක් ලූප වේ. සමහර සැසඳීම් සඳහා ස්නිපිට් පරීක්ෂා කරන්න

// open the dev console to see results

count = 100000

console.time("from object")
for (let i = 0; i<count; i++) {
  range = Array.from({length:10}, (v,i) => i )
}
console.timeEnd("from object")

console.time("from keys")
for (let i =0; i<count; i++) {
  range = Array.from(Array(10).keys())
}
console.timeEnd("from keys")

console.time("apply")
for (let i = 0; i<count; i++) {
  range = Array.apply(null, { length: 10 }).map(function(element, index) { return index; })
}
console.timeEnd("apply")


හේයි ඒක පිළිවෙලයි, මම එයට කැමතියි. කෙසේ වෙතත් එය OP අපේක්ෂා කරන ප්‍රති results ල ලබා නොදේ. එය සිදු කිරීම සඳහා එය ලිවිය යුතුයArray.from({length:N}, (v,i) => i+1)
CervEd

මෙම නියෝ හැක්ස් තවමත් හොඳ පැරණි ලූපයකට වඩා 5-10x මන්දගාමී වේ .
ඩෑන් ඩස්කල්ස්කු

17

ES6 හි:

Array.from({length: 1000}, (_, i) => i).slice(1);

හෝ වඩා හොඳ තවමත් (අතිරේක විචල්‍යය නොමැතිව _ සහ අතිරේක sliceඇමතුමකින් තොරව ):

Array.from({length:1000}, Number.call, i => i + 1)

හෝ තරමක් වේගවත් ප්‍රති results ල සඳහා, ඔබේ ලැයිස්තුව ප්‍රති results ල 256 ට වඩා කෙටි නම් ඔබට Uint8Array භාවිතා කළ හැකිය (නැතහොත් ලැයිස්තුව කෙතරම් කෙටිද යන්න මත පදනම්ව ඔබට වෙනත් Uint ලැයිස්තු භාවිතා කළ හැකිය, උපරිම අංක 65535 සඳහා Uint16 හෝ උපරිම සඳහා Uint32 වැනි 4294967295 යනාදිය. නිල වශයෙන්, මෙම ටයිප් කළ අරා එකතු කරන ලද්දේ ඊඑස් 6 හි පමණි ). උදාහරණයක් වශයෙන්:

Uint8Array.from({length:10}, Number.call, i => i + 1)

ES5:

Array.apply(0, {length: 1000}).map(function(){return arguments[1]+1});

විකල්පයක් ලෙස, ES5 හි, සිතියම් ක්‍රියාකාරිත්වය සඳහා ( Array.fromඉහත ES6 හි ශ්‍රිතයේ දෙවන පරාමිතිය වැනි ), ඔබට Number.call භාවිතා කළ හැකිය

Array.apply(0,{length:1000}).map(Number.call,Number).slice(1)

නැත්නම්, ඔබ විරුද්ධ නම් .slice මෙහි ද , ඔබට ඉහත සඳහන් කළ ES5 ට සමාන (ES6 වෙතින්) කළ හැකිය:

Array.apply(0,{length:1000}).map(Number.call, Function("i","return i+1"))

16

නව අරා ක්‍රම භාවිතා කිරීම සහ =>ES6 ප්‍රමිතියෙන් ක්‍රියාකාරී සින්ටැක්ස් භාවිතා කිරීම (ලියන අවස්ථාවේ ෆයර්ෆොක්ස් පමණි).

සිදුරු පිරවීමෙන් undefined:

Array(N).fill().map((_, i) => i + 1);

Array.from"සිදුරු" බවට පත් undefinedකිරීම Array.mapඅපේක්ෂිත පරිදි ක්‍රියා කරයි:

Array.from(Array(5)).map((_, i) => i + 1)

7
ඒ හා සමානව, ඔබට ES6 හි පහත සඳහන් දෑ ද කළ හැකිය : Array.from({length: N}, (v, k) => k).
XåpplI'-I0llwlg'I -

Xappli ගේ ප්‍රවේශය වඩාත් සුදුසුය: Array.from නිර්මාණය කරන ලද්දේ මෙම නිශ්චිත වාතාවරණය සඳහා වන අතර, එයින් ඇඟවෙන්නේ සිතියම්ගත කිරීමේ ඇමතුමක්. අරා-වැනි දෙයක් සඳහා අරා ක්‍රම භාවිතා කිරීමට අවශ්‍ය සාමාන්‍ය ගැටළුවට එය කදිම විසඳුමකි Array.prototype.map.call, වැනි වාචික ප්‍රවේශයන් වෙත යොමුවීමකින් තොරව , උදා: නෝඩ්ලිස්ට් සඳහා ආපසු පැමිණීම document.querySelectorAll. developer.mozilla.org/en/docs/Web/JavaScript/Reference/...
Qaribou සිට ජොශ්

මම මෙය අවධාරනය කරන්නේ අවධාරනය කරන පරාසයේ වාක්‍ය ඛණ්ඩයට එරෙහිව වන අතර පරාසය වඩා හොඳින් කියවයි.
ooolala

තාක්ෂණික වශයෙන් එය Array.fromවිරල අගයන් නිර්වචනය නොකළ දෙයක් නොවේ. ඒ වෙනුවට Array(5)විරල අගයන් නිර්වචනය නොකළ අගයන් ලෙස අර්ථකථනය කරන තර්ක වස්තුවක් ලෙස හැඳින්වේ :)
CervEd



11

මෙම සම්පූර්ණ පිළිතුරු ලැයිස්තුවේ දැනට නොමැති එකම රසය ජනක යන්ත්‍රයක් බව පෙනේ; එබැවින් එයට පිළියමක් ලෙස:

const gen = N => [...(function*(){let i=0;while(i<N)yield i++})()]

මෙසේ භාවිතා කළ හැකිය:

gen(4) // [0,1,2,3]

මෙහි ඇති හොඳ දෙය නම් ඔබ වැඩි කළ යුතු නොවේ ... igor-shubin දුන් පිළිතුරෙන් ආශ්වාදයක් ලබා ගැනීම සඳහා, ඔබට ඉතා පහසුවෙන් අහඹු ලෙස නිර්මාණය කළ හැකිය:

const gen = N => [...(function*(){let i=0;
  while(i++<N) yield Math.random()
})()]

දිගුකාලීන මෙහෙයුම් මිල අධික දෙයක් වෙනුවට :

const slow = N => new Array(N).join().split(',').map((e,i)=>i*5)
// [0,5,10,15,...]

ඔබට ඒ වෙනුවට කළ හැකිය:

const fast = N => [...(function*(){let i=0;while(i++<N)yield i*5})()]

10

තවත් ES6 අනුවාදයක් පමණි.

Array.fromදෙවන විකල්ප තර්කය භාවිතා කිරීමෙන් :

Array.from (arrayLike [, mapFn [, thisArg]])

හිස් Array(10)ස්ථාන වලින් අපට අංකිත අරාව සෑදිය හැකිය :

Array.from(Array(10), (_, i) => i)

var arr = Array.from(Array(10), (_, i) => i);
document.write(arr);


මෙය වඩාත් සංකීර්ණ වන අතර x 10x වඩා මන්දගාමී වේ [...Array(11).keys()].slice(1).
ඩෑන් ඩස්කල්ස්කු

10

Iterable භාවිතා අනුවාදය ජනකය වෙනස් නොවන බව උත්සවය Number.prototype.

function sequence(max, step = 1) {
  return {
    [Symbol.iterator]: function* () {
      for (let i = 1; i <= max; i += step) yield i
    }
  }
}

console.log([...sequence(10)])


: FWIW, ඔබ තරමක් මෙම කේතය කෙටි කිරීමට වස්තුව කාර්යය දේපල කිමෙක්ද යන්න සාරාංශ කළ හැකි {*[Symbol.iterator]() {... etc ...}} බලන්න developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
broofa


9

Object.keys(Array.apply(0, Array(3))).map(Number)

ප්‍රතිලාභ [0, 1, 2]. ඊගෝර් ෂුබින්ගේ විශිෂ්ට පිළිතුරට බොහෝ සමාන ය , නමුත් තරමක් අඩු උපක්‍රම සහිතව (සහ එක් චරිතයක් දිගු).

පැහැදිලි කිරීම:

  • Array(3) // [undefined × 3]දිග n = 3 අරාවක් ජනනය කරන්න. අවාසනාවට මෙම අරාව අපට බොහෝ දුරට නිෂ් less ල ය, එබැවින් අපට…
  • Array.apply(0,Array(3)) // [undefined, undefined, undefined]අරාව නැවත කළ හැකි කරන්න. සටහන: අයදුම් කිරීමේ පළමු ආරුක්කුව මෙන් ශුන්‍යය වඩාත් සුලභ නමුත් 0 කෙටි වේ.
  • Object.keys(Array.apply(0,Array(3))) // ['0', '1', '2'] ඉන්පසු අරාවේ යතුරු ලබා ගන්න (ක්‍රියා කරන්නේ අරා යනු යතුරු සඳහා වන දර්ශක සහිත වස්තුවකි.
  • Object.keys(Array.apply(0,Array(3))).map(Number) // [0, 1, 2] යතුරු හරහා සිතියම් ගත කරන්න, නූල් සංඛ්‍යා බවට පරිවර්තනය කරයි.

9
Array(8).fill(0).map(Number.call, Number)

Igors Number.callඋපක්‍රම සොරකම් කිරීම නමුත් fill()තරමක් කෙටි කිරීමට භාවිතා කිරීම. ES6 සහ ඊට ඉහළින් පමණක් ක්‍රියා කරයි.


මෙය 1 සිට 8 දක්වා නොව 0 සිට 7 දක්වා සංඛ්‍යා පරාසයක් නිර්මාණය කරනු ඇත
රිචඩ් හැමිල්ටන්
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.