Tampon circulaire en JavaScript
Quelqu'un a déjà mis en œuvre un tampon circulaire en JavaScript? Comment voudriez-vous faire cela sans avoir des pointeurs?
- Vous devriez préciser "tampon circulaire". Quelle sorte d'API vous intéresse? Ce qui se passe dans le tampon? etc etc
- Idéalement, l'API serait composé de: push ( clé, valeur ) get ( clé ) et lorsque la mémoire tampon a atteint sa taille maximale, le premier élément enregistré est écrasé.
Vous devez vous connecter pour publier un commentaire.
Étrange coïncidence, je viens d'écrire un plus tôt aujourd'hui! Je ne sais pas ce qu'est exactement vos besoins, mais cela pourrait être d'utiliser.
Il présente une interface comme un Tableau de longueur illimitée, mais "oublie" vieux articles:
CircularBuffer.prototype.push = function(v) { this._array[this.length%this._array.length] = v; this.length++; };
Infinity
. +1Mise à jour: dans le cas où vous remplissez le tampon avec uniquement des chiffres, en voici quelques-un liner plugins:
pointer = (length + pointer +1) % length
au lieu de simplementpointer = (pointer + 1) % length
?get : function(key){ if (key < 0){ return buffer[pointer+key]; } else if (key === false){ return buffer[pointer - 1]; } else{ return buffer[key]; } },
à l'appui de négatif d'indexation (à partir de la droite) et par défaut la dernière chose poussé si aucune touche n'est donnée.Comme beaucoup d'autres, j'ai aimé noiv de la solution, mais je voulais un peu plus agréable API:
Améliorations par rapport à l'original:
get
prend en charge par défaut de l'argument (retourne le dernier élément poussé sur le tampon)get
prend en charge négative de l'indexation (compte à partir de la droite)prev
coups de tampon de retour un et renvoie ce qu'il y a (comme le popping, sans les supprimer)next
annule prev (se déplace de la mémoire tampon de l'avant et le renvoie)J'ai utilisé ceci pour stocker un historique des commandes qui je pourrais alors feuilleter dans une application à l'aide de son
prev
etnext
méthodes, ce qui bien de retour indéfini quand ils n'ont nulle part où aller.C'est un moyen rapide maquette du code que vous pourriez utiliser (il n'est probablement pas de travail et a des bugs, mais il montre la façon dont il pourrait être fait):
l'aide de cet objet serait comme:
Vous pouvez bien sûr mettre en œuvre à l'aide du tableau ainsi avec une classe qui permettrait d'utiliser à l'interne d'un tableau et de garder une valeur de l'index de l'élément et le déplacement de celui-là.
J'utilise personnellement la mise en œuvre de Trevor Norris que vous pouvez trouver ici:
https://github.com/trevnorris/cbuffer
et je suis très heureux avec elle 🙂
Court et doux:
De sortie:
Je ne pouvais pas obtenir de Robert Koritnik du code de travail, donc j'ai édité à la suite de ce qui semble fonctionner:
À utiliser:
J'aime vraiment comment noiv11 résolu ce et pour mon besoin, j'ai ajouté un supplément de propriété "tampon" qui renvoie la mémoire tampon:
Au lieu de la mise en œuvre de la circulaire de la file d'attente avec le JavaScript, nous pouvons utiliser certaines intégré des fonctions de tableau à atteindre file d'attente circulaire de mise en œuvre.
exemple:
Supposons que nous avons besoin pour mettre en œuvre la circulaire de la file d'attente de longueur 4.
De sortie:
circulaire
[4, 3, 2, 1]
Si vous essayez d'ajouter un autre élément de ce tableau par exemple:
De sortie:
circulaire
[5, 4, 3, 2]
Une approche serait d'utiliser une liste chaînée comme d'autres l'ont suggéré. Une autre technique est d'utiliser un simple tableau en mémoire tampon et de garder une trace de la lire et d'écrire des positions via des indices dans ce tableau.
Je pense que vous devriez être en mesure de le faire en utilisant simplement des objets. Quelque chose comme ceci:
Maintenant, vous auriez juste à stocker la valeur de chaque lien de la valeur de la propriété.
new
de l'opérateur.Grâce noiv pour votre simple et efficace solution. J'ai aussi besoin d'être en mesure d'accéder à la mémoire tampon comme PerS ne, mais je voulais obtenir les éléments dans l'ordre où ils ont été ajoutés. Voici donc ce que j'ai:
Voici la suite de tests:
Sans vergogne auto plug:
Si vous êtes à la recherche pour une rotation node.js tampon, j'ai écrit un qui peut être trouvé ici: http://npmjs.org/packages/pivot-buffer
Documentation est actuellement défaut, mais
RotatingBuffer#push
vous permet d'ajouter un tampon de la tampon de courant, en tournant les données précédentes si la nouvelle longueur est plus grande que la longueur spécifié dans le constructeur.Il est très facile si vous maintenant ce que Tableau.le prototype.longueur est:
Près de 10 ans plus tard, une réponse à l'aide de JavaScript ES6:
JS:
Je préfère des approches plus simples. Ce doit être un trois-liner, de l'OMI.
Quelque chose comme
Alors vous pouvez simplement