124 votes

Initialisation d'un tableau avec une seule valeur

Existe-t-il un moyen plus compact de procéder à ce type d'initialisation ?

for (var i = 0; i < arraySize; i++) array[i] = value;

0 votes

48voto

DoXicK Points 2091
while(arraySize--) array.push(value);

pas d'initialisation (à ma connaissance)


Mise à jour

Depuis que j'ai posté cette réponse il y a 4 ans, les gens semblent revenir ici pour cette réponse. À des fins d'évaluation, j'ai fait un JSPerf avec des solutions différentes.

La solution ci-dessus n'est pas la plus rapide, mais elle est courte. Pour rester dans le même style court, mais avec une meilleure performance :

while(size--) array[size] = value;

Mise à jour février 2016 Mise à jour de la JSPerf avec une nouvelle révision avec plus de cas de test.

Si la performance n'a pas d'importance et que vous voulez une phrase toute faite :

var value = 1234, // can be replaced by a fixed value
    size  = 1000, // can be replaced by a fixed value
    array = Array.apply(null,{length: size}).map(function() { return value; });

Une solution plus performante (en une seule, sale, ligne) : Attention : cela remplace les variables value, size et i existantes dans la portée.

for(var i = 0, value = 1234, size = 1000, array = new Array(1000); i < size; i++) array[i] = value;

0 votes

Dans de nombreux cas, "arraySize" ne serait pas mutable (pourrait être une constante ou un littéral ou - je sais, mauvaise pratique - "array.length"). En représentant la taille comme une variable, j'ai rendu cette partie peu claire.

1 votes

Vrai : "for(var i = arraySize ; i-- ;) array.push(value) ;" alors :-) mais je pense que vous l'avez déjà compris

1 votes

Vous avez raison - cette syntaxe permet de gagner cinq caractères ;-)

10voto

Aequitas Points 91

L'OP semble rechercher la compacité dans un scénario à usage unique plutôt que l'efficacité et la réutilisation. Pour ceux qui recherchent l'efficacité, voici une optimisation qui n'a pas encore été mentionnée. Puisque vous connaissez la longueur du tableau à l'avance, allez-y et définissez-la avant d'assigner les valeurs. Sinon, le tableau sera redimensionné à plusieurs reprises à la volée, ce qui n'est pas idéal !

function initArray(length, value) {
    var arr = [], i = 0;
    arr.length = length;
    while (i < length) { arr[i++] = value; }
    return arr;
}

var data = initArray(1000000, false);

1 votes

En JavaScript, for est 2 fois plus rapide que while .

2 votes

Je ne dirais pas que c'est aussi exact que ça : stoimen.com/blog/2012/01/24/javascript-performance-for-vs-while Il est certain que vous ne voudriez pas toujours utiliser exclusivement l'un ou l'autre - cela va à l'encontre de leur objectif. C'est le travail de l'interprète ou du compilateur d'accélérer les choses là où il le peut, pas le vôtre. Mais même cela n'est pas toujours vrai.

9voto

Christopher Weiss Points 242

Il n'est pas aussi compact, mais il est sans doute plus direct.

array = Array.apply(null, new Array(arraySize)).map(function () {return value;});

6voto

Christopher Weiss Points 242

Il est peu probable que cette technique soit meilleure que les autres, mais elle est amusante...

var a = new Array(10).join('0').split('').map(function(e) {return parseInt(e, 10);})

0 votes

Pouvez-vous expliquer pourquoi var arr = (new Array(5)).map(() => 1); ne fonctionne pas ?

1 votes

La méthode map() ne fonctionne que sur les valeurs du tableau. Elle ignore les éléments non définis.

0 votes

Donc après new Array(5) quand on fait une carte, n'opère-t-on pas sur un tableau ? En outre, cette [1,undefined,3].map(() => 5) fonctionne comme prévu. Il ne saute pas undefined

3voto

Kyaw Tun Points 3878

Par souci d'efficacité, j'éviterais push . Donc simplement

for (var i = 0; i < arraySize; i++) array[i] = value; 

Pour IE10 :

array = new Array(arraySize); 
for (var i = 0; i < arraySize; i++) array[i] = value; 

Edit : modifié comme discuté dans les commentaires.

0 votes

for (var i = 0; i < arraySize; ++i) a presque les mêmes performances que votre code, mais est plus propre. Mais while (arraySize--) est 2 fois plus lent.

0 votes

Oui, mais l'allocation de mémoire pour array est plus efficace que de commencer array[0] .

2 votes

Non. Si vous commencez à initialiser un tableau depuis la fin, des tables de hachage seront utilisées en interne, mais si vous commencez à initialiser un tableau depuis 0, et que vous n'avez que des indices séquentiels, un vrai tableau sera utilisé (au moins dans V8). JavaScript n'alloue pas les éléments (highest_index+1), il alloue uniquement les éléments initialisés.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X