J'ai besoin d'ajouter ou d'ajouter des éléments au début d'un tableau.
Par exemple, si mon tableau ressemble à ci-dessous:
[23, 45, 12, 67]
Et la réponse de mon appel AJAX est 34
, je veux que le tableau mis à jour soit comme suit:
[34, 23, 45, 12, 67]
Actuellement, je prévois de le faire comme ceci:
var newArray = [];
newArray.push(response);
for (var i = 0; i < theArray.length; i++) {
newArray.push(theArray[i]);
}
theArray = newArray;
delete newArray;
Y a-t-il une meilleure façon de procéder? Javascript a-t-il une fonctionnalité intégrée qui le fait?
La complexité de ma méthode est O(n)
et il serait vraiment intéressant de voir de meilleures implémentations.
javascript
arrays
Lune
la source
la source
push
instructions suivies d'un appel àreverse
, au lieu d'appelerunshift
tout le temps.Réponses:
Utilisez
unshift
. C'est commepush
, sauf qu'il ajoute des éléments au début du tableau au lieu de la fin.unshift
/push
- ajoute un élément au début / fin d'un tableaushift
/pop
- supprime et retourne le premier / dernier élément d'un tableauUn schéma simple ...
et graphique:
Consultez la documentation de la baie MDN . Pratiquement tous les langages qui ont la capacité de pousser / pop des éléments d'un tableau auront également la possibilité de décaler / déplacer (parfois appelés
push_front
/pop_front
) des éléments, vous ne devriez jamais avoir à les implémenter vous-même.Comme indiqué dans les commentaires, si vous souhaitez éviter de muter votre tableau d'origine, vous pouvez utiliser
concat
, qui concatène deux tableaux ou plus ensemble. Vous pouvez l'utiliser pour pousser fonctionnellement un seul élément à l'avant ou à l'arrière d'un tableau existant; pour ce faire, vous devez transformer le nouvel élément en un seul tableau d'éléments:concat
peut également ajouter des éléments. Les arguments deconcat
peuvent être de tout type; ils sont implicitement enveloppés dans un tableau à un seul élément, s'ils ne sont pas déjà un tableau:la source
concat
peut être préférable car elle renvoie le nouveau tableau. Très utile pour enchaîner.[thingToInsertToFront].concat(originalArray).reduce(fn).reverse().map(fn)
etc ... Si vous utilisezunshift
, vous ne pouvez pas faire ce chaînage car tout ce que vous récupérez est la longueur.la source
Avec ES6, utilisez l'opérateur d'étalement
...
:DEMO
la source
concat
place.Une autre façon de le faire grâce à
concat
La différence entre
concat
etunshift
est queconcat
renvoie un nouveau tableau. La performance entre eux peut être trouvée ici .Voici le résultat du test
la source
unshift
:: 25 510 ± 3,18% 99% plus lentconcat
: 2 436 894 ± 3,39% le plus rapideCheatsheet rapide:
Les termes shift / unshift et push / pop peuvent être un peu déroutants, du moins pour les personnes qui ne sont pas familières avec la programmation en C.
Si vous n'êtes pas familier avec le jargon, voici une traduction rapide de termes alternatifs, qui peuvent être plus faciles à retenir:
la source
vous avez un tableau:
var arr = [23, 45, 12, 67];
Pour ajouter un élément au début, vous souhaitez utiliser
splice
:la source
unshift
50% plus rapide (mais surtout plus lisible)Sans mutate
En fait, tout
unshift
/push
etshift
/pop
mute le tableau d'origine.Le
unshift
/push
ajouter un élément au tableau existant de début / fin etshift
/pop
supprimer un élément du début / fin d'un tableau.Mais il existe peu de façons d'ajouter des éléments à un tableau sans mutation. le résultat est un nouveau tableau, à ajouter à la fin du tableau, utilisez le code ci-dessous:
Pour ajouter au début du tableau d'origine, utilisez le code ci-dessous:
Avec la méthode ci-dessus, vous ajoutez au début / à la fin d'un tableau sans mutation.
la source
slice
fonction à la fin de l'originArray
empêcher de mutabilité.Utilisation de la déstructuration ES6: (en évitant la mutation hors du tableau d'origine)
const newArr = [item, ...oldArr]
la source
Si vous devez insérer un élément en continu au début d'un tableau, il est plus rapide d'utiliser des
push
instructions suivies d'un appel àreverse
, au lieu d'appelerunshift
tout le temps.Test de référence: http://jsben.ch/kLIYf
la source
En utilisant
splice
nous insérons un élément dans un tableau au début:la source