J'ai ce qui suit pour la boucle, et lorsque j'utilise splice()
pour supprimer un élément, j'obtiens alors que «secondes» n'est pas défini. Je pourrais vérifier si ce n'est pas défini, mais je pense qu'il y a probablement une façon plus élégante de le faire. Le souhait est simplement de supprimer un élément et de continuer.
for (i = 0, len = Auction.auctions.length; i < len; i++) {
auction = Auction.auctions[i];
Auction.auctions[i]['seconds'] --;
if (auction.seconds < 0) {
Auction.auctions.splice(i, 1);
}
}
javascript
loops
dzm
la source
la source
Auction.auctions[i]['seconds']--
au lieu deauction.seconds--
?Réponses:
Le tableau est réindexé lorsque vous effectuez un
.splice()
, ce qui signifie que vous sauterez un index lorsqu'il est supprimé et que votre cache.length
est obsolète.Pour y remédier, vous devez soit décrémenter
i
après a.splice()
, soit simplement répéter en sens inverse ...De cette façon, la réindexation n'affecte pas l'élément suivant dans l'itération, car l'indexation affecte uniquement les éléments du point actuel à la fin du tableau, et l'élément suivant de l'itération est inférieur au point actuel.
la source
C'est un problème assez courant. La solution est de boucler en arrière:
Peu importe que vous les supprimiez de la fin, car les indices seront conservés lorsque vous reculerez.
la source
Recalculez la longueur à chaque fois dans la boucle au lieu de simplement au début, par exemple:
De cette façon, vous ne dépasserez pas les limites.
EDIT: ajout d'un décrément dans l'instruction if.
la source
Bien que votre question concerne la suppression d'éléments du tableau en cours d'itération et non la suppression efficace d'éléments (en plus d'un autre traitement), je pense que l'on devrait le reconsidérer si dans une situation similaire.
La complexité algorithmique de cette approche se présente
O(n^2)
sous la forme d'une fonction d'épissage et la boucle for itère sur le tableau (la fonction d'épissage déplace tous les éléments du tableau dans le pire des cas). Au lieu de cela, vous pouvez simplement pousser les éléments requis vers le nouveau tableau, puis simplement affecter ce tableau à la variable souhaitée (qui vient d'être itérée).Depuis ES2015, nous pouvons utiliser
Array.prototype.filter
pour tout ranger sur une seule ligne:la source
la source
Si vous utilisez ES6 + - pourquoi ne pas simplement utiliser la méthode Array.filter?
Notez que la modification de l'élément de tableau pendant l'itération du filtre ne fonctionne que pour les objets et ne fonctionnera pas pour le tableau de valeurs primitives.
la source
Une autre solution simple pour digérer une fois les éléments d'un tableau:
la source
Voici un autre exemple d'utilisation correcte de l'épissure. Cet exemple est sur le point de supprimer «attribut» de «tableau».
la source
À toute personne qui a répondu à cette question très simple avec un code ayant splice () dans une boucle, qui a exécuté le temps O (n 2 ), ou qui a voté une telle réponse, au cours des sept années écoulées depuis la publication de cette question: vous devriez avoir honte .
Voici une solution de temps linéaire simple à ce problème de temps linéaire simple.
Lorsque j'exécute cet extrait, avec n = 1 million, chaque appel à filterInPlace () prend 0,013 à 0,016 seconde. Une solution quadratique (par exemple, la réponse acceptée) prendrait un million de fois ou plus.
Notez que cela modifie le tableau d'origine en place plutôt que de créer un nouveau tableau; le faire en place comme ceci peut être avantageux, par exemple dans le cas où le tableau est le goulot d'étranglement de mémoire unique du programme; dans ce cas, vous ne voulez pas créer un autre tableau de la même taille, même temporairement.
la source
Array.splice(i,1)
créer une nouvelle instance de tableau à chaque fois. J'ai très honte.Il y a déjà beaucoup de réponses merveilleuses sur ce fil. Cependant, je voulais partager mon expérience lorsque j'ai essayé de résoudre "supprimer le nième élément du tableau" dans le contexte ES5.
Les tableaux JavaScript ont différentes méthodes pour ajouter / supprimer des éléments du début ou de la fin. Ceux-ci sont:
Essentiellement, aucune des méthodes ci-dessus ne peut être utilisée directement pour supprimer le nième élément du tableau.
Cela nous laisse essentiellement avec une seule méthode de tableau
Array.splice
pour effectuer la suppression du nième élément (il y a d'autres choses que vous pourriez faire avec ces méthodes également, mais dans le contexte de cette question, je me concentre sur la suppression des éléments):Voici le code copié de la réponse originale (avec commentaires):
Une autre méthode remarquable est
Array.slice
. Cependant, le type de retour de cette méthode est les éléments supprimés. Cela ne modifie pas non plus le tableau d'origine. Extrait de code modifié comme suit:Cela dit, nous pouvons toujours utiliser
Array.slice
pour supprimer le nième élément comme indiqué ci-dessous. Cependant c'est beaucoup plus de code (donc inefficace)la source
Essayez de relayer un tableau dans newArray lors de la boucle:
la source
Deux exemples qui fonctionnent:
la source
Essayez ceci
la source
la source
Vous pouvez simplement regarder à travers et utiliser
shift()
la source