Quelle serait la meilleure façon de créer ce tableau:
var x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
11, 12, 13, 14, 15, 16, 17, 18, 19, 20];
Par exemple, une boucle for
:
var x = [];
for (var i=1;i<=20;i++) {
x.Push(i);
}
Ou une boucle while
:
var x = [], i = 1, endInt = 20;
while (i <= endInt) {
x.Push(i);
i++;
}
Y a-t-il d'autres exemples qui seraient moins précis - autrement dit - moins de code? Je pense à des choses comme en Ruby où le code équivalent serait aussi simple que 1..20
. Je ne connais pas cette syntaxe en JavaScript, mais je me demande s’il existe des moyens plus courts de faire la même chose.
MISE À JOUR: Je ne pensais pas supprimer les points-virgules ou var
pour les réponses à la question, mais je dois admettre que la question implique cela. Je suis plus curieux à propos des algorithmes que du rasage des octets. Désolé si je n'étais pas clair! En outre, en faire une fonction est assez simple, claquez simplement function range(start, end) { /* guts here */ }
et vous y êtes. La question est de savoir s'il existe de nouvelles approches du "tripes".
Cela peut être fait avec les fonctionnalités de l'ES6, actuellement uniquement supportées par Firefox Thou. J'ai trouvé un tableau de compatibilité ici: http://kangax.github.io/compat-table/es6/
Array.from(new Array(20), (x,i) => i+1)
Si vous voulez avoir une autre gamme alors je suppose que vous pourriez faire
Array.from(new Array(5), (x,i) => i+5)
Ce qui serait alors [5,6,7,8,9]
Vous pouvez le faire avec une boucle while où le Push a lieu dans la condition.Array.Push renvoie la longueur du tableau, qui se trouve être identique à la valeur dans ce cas. Donc, vous pouvez faire ce qui suit:
x = []; //normally would use var here
i = 1; //normally would use var here
while(x.Push(i++)<20){}
//at this point, x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
Version condensée (31 caractères)
x=[];i=1;while(x.Push(i++)<20);
while-- est le chemin à parcourir
var a=[],b=10;while(b--)a[b]=b+1
retourne [1,2,3,4,5,6,7,8,9,10]
expliqué avec start & length
var array=[],length=20,start=5;while(length--)array[length]=length+start
retours [5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24]
veux la gamme?
expliqué avec start & end
var array=[],end=30,start=25,a=end-start+1;while(a--)array[a]=end--
retourne [25, 26, 27, 28, 29, 30]
pour --
for(var a=[],b=20;b>0;b--,a[b]=b+1)
pour ++
for(var a=[],b=0;b<20;b++,a[b]=b+1)
POURQUOI est-ce la voie à suivre?
while - est prolly la boucle la plus rapide;
le réglage direct est plus rapide que Push & concat;
[] est également plus rapide que le nouveau tableau (10);
ce n'est pas beaucoup plus long que tous les autres
techniques d'économie d'octets:
donc, si vous voulez une fonction pour cette
avec début, fin (plage)
function range(a,b,c,d){d=[];c=b-a+1;while(c--)d[c]=b--;return d}
alors maintenant gamme (3,7) retourne [3,4,5,6,7]
vous économisez des octets de nombreuses façons ici et cette fonction est également très rapide car elle n’utilise pas concat, Push, new Array et c’est fait avec le temps -
Vous pouvez toujours créer une fonction ...
function createNumArray(a, b) {
var arr = [],
i = a;
while((arr[arr.length] = i) < b) {i++}
return arr;
}
Ce qui vous permet d'écrire un code succinct plus tard, tel que ...
var arr = createNumArray(1, 20);
Si vous cherchez à éliminer les personnages de toute façon possible sans vous soucier de la lisibilité, voici le mieux que je puisse faire:
var x=[],i=0
while(i<20)
x[i]=i+++1
Pas beaucoup mieux que le vôtre cependant.
Modifier:
En fait, cela fonctionne mieux et élimine quelques personnages:
var x=[],i=0
while(i<20)
x[i]=++i
Edit 2:
Et voici mon entrée pour une fonction générale "plage" dans le plus petit nombre de caractères:
function range(s,e){var x=[];while(s<e+1)x.Push(s++);return x}
Encore une fois, n'écrivez pas le code de cette façon. :)
Je suppose que c'est le chemin le plus court:
var i=0, arr = [];
while (i++<20){
arr.Push(i);
}
ou s'associer sur le code 'pervers' dans EndangeredMassa
var i,arr; while (i=i||1, (arr=arr||[]).Push(i++)<20){}
J'étendrais le prototype d'Array pour simplifier l'accès:
Array.prototype.range = function(start, end) {
if (!this.length) {
while (end >= start) {
this.Push(start++);
}
} else {
throw "You can only call 'range' on an empty array";
}
return this;
};
var array = [].range(1, 20);
Bien que ce qui précède soit le plus proche auquel je puisse penser en ce qui concerne le sucre syntaxique que vous recherchez, vous pouvez essayer CoffeeScript .
Il supporte la notation que vous recherchez.
CoffeeScript:
test = [1..20]
alert test
Render to JavaScript:
var test;
test = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20];
alert(test);
Vous pouvez essayer des exemples en direct sur leur site et voir la conversion effectuée au fur et à mesure que vous tapez.
Cliquez simplement sur le lien TRY COFFEESCRIPT en haut et vous obtiendrez une console où vous pourrez tester du code.
À ma connaissance, la possibilité d'utiliser la boucle for, comme vous l'avez mentionné, est la plus concise.
C'est,
var x = [];
for (var i=1;i<=20;i++) {
x.Push(i);
}
var i = 0;
var x = [];
while (i++ < 20) x.Push(i);