315 votes

Le moyen le plus efficace pour mettre un tableau en Javascript

en supposant que j'ai un tableau X et X a une taille de N (N > 0)

est-il un moyen plus efficace de faire précéder le tableau qui n'exigerait pas de O(N+1) étapes?

dans le code, essentiellement, je suis actuellement en train de faire est

function prependArray(value,oldArray)
{
  var newArray = new Array(value);
  for(var i=0;i<oldArray.length;++i)
  {
    newArray.push(oldArray[i]);
  } 
  return newArray;
}

Merci

556voto

maerics Points 47743

Je ne suis pas sûr plus efficace en termes de big-O, mais certainement à l'aide de l' unshift méthode est plus concis (et donc probablement plus facile à comprendre):

var a = [1, 2, 3, 4];
a.unshift(0);
a; // => [0, 1, 2, 3, 4]

[Modifier]

Cette jsPerf de référence montre qu' unshift est décemment plus rapide dans au moins un couple de navigateurs, quel que soit éventuellement différents, big-O de la performance iff vous êtes ok avec la modification du tableau en place. Si vous ne pouvez vraiment pas muter le tableau d'origine, alors vous feriez quelque chose comme l'extrait de code ci-dessous, qui ne semble pas être sensiblement plus rapide que votre solution:

a.slice(0).unshift(0); // Use "slice" to avoid mutating "a".

53voto

mgiuca Points 10265

Si vous êtes ajoutant un tableau à l'avant d'un autre tableau, il est plus efficace d'utiliser concat. Donc:

var newArray = values.concat(oldArray);

Mais ce sera toujours en O(N) dans la taille de oldArray. C'est toujours plus efficace que manuellement une itération sur oldArray. Aussi, selon les détails, il peut vous aider, parce que si vous allez à ajouter beaucoup de valeurs, il est préférable de les mettre dans un tableau en premier et ensuite concat oldArray sur la fin, plutôt que de l'ajouter au début de chacun d'eux individuellement.

Il n'y a pas moyen de faire mieux que O(N) dans la taille de oldArray, car les tableaux sont stockés dans la mémoire contiguë avec le premier élément dans une position fixe. Si vous souhaitez insérer avant le premier élément, vous devez déplacer tous les autres éléments. Si vous avez besoin d'un moyen de contourner cela, faire ce que @GWW dit et utiliser une liste chaînée, ou une autre structure de données.

6voto

kennebec Points 33886

f vous avez besoin de conserver l'ancien tableau, tranche l'ancien et unshift la nouvelle valeur(s) au début de la tranche.

var oldA=[4,5,6];
newA=oldA.slice(0);
newA.unshift(1,2,3)

oldA+'\n'+newA

/*  returned value:
4,5,6
1,2,3,4,5,6
*/

3voto

bjornd Points 11457

Il y a de la méthode spéciale:

a.unshift(value);

Mais si vous voulez ajouter plusieurs éléments à un tableau, il serait plus rapide d'utiliser une telle méthode:

var a = [1, 2, 3],
    b = [4, 5];

function prependArray(a, b) {
    var args = b;
    args.unshift(0);
    args.unshift(0);
    Array.prototype.splice.apply(a, args);
}

prependArray(a, b);
console.log(a); // -> [4, 5, 1, 2, 3]

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