3 votes

Retirer un élément d'un tableau après un délai d'attente Node.js

J'ai un tableau qui est très dynamique, il y a de nouveaux éléments tout le temps, et d'autres éléments sont supprimés . Le problème est que parfois, dans certaines circonstances, il est possible que certains éléments restent dans le tableau pour toujours et ce n'est PAS ce que je veux. Chaque élément doit être retiré du tableau dans les 15 secondes, sinon, le tableau doit retirer cet élément automatiquement.

Par exemple, dans le code ci-dessous, nous avons un tableau avec trois éléments :

var array = ['e1', 'e2', 'e3'];

Après 5 secondes, j'ajoute 2 éléments supplémentaires dans le tableau :

array[3] = 'e4';
array[4] = 'e5';

Maintenant, disons que les 3 premiers éléments sont insérés dans le tableau à 12:00:00 et les 2 autres à 12:00:05. Je veux que les 3 premiers éléments soient retirés à 12:00:15pm, et les 2 seconds éléments à 12:00:20pm......Etc.....

Avez-vous des idées sur la façon de résoudre ce problème ?

3voto

Josh Beam Points 7825

Vous devrez stocker une référence au moment où vous avez inséré les valeurs dans le tableau afin de pouvoir les supprimer à un moment donné. Pour cela, vous pouvez utiliser un objet JavaScript ordinaire :

var map = {};

map[Date.now()] = ['a', 'b'];
console.log(map);

setTimeout(function() {
  map[Date.now()] = ['c', 'd'];
  console.log(map);
}, 5000);

setInterval(function() {
  var times = Object.keys(map);

  times.forEach(function(time) {
    if(Date.now() > (+time + 14000)) {
      delete map[time];
    }
  });

  console.log(map);
}, 1000);

Essentiellement, j'enregistre les heures comme clés, et le tableau d'éléments comme valeur. (Cliquez sur "Exécuter l'extrait de code" ci-dessus pour voir la sortie de la console et voir comment cela se passe).

En gros, nous avons mis en place une "tâche cron" (simple setInterval ) qui s'exécute toutes les secondes et vérifie si l'heure de création de la clé est inférieure à 14 secondes (et non 15 secondes, puisque la tâche cron s'exécute toutes les secondes). Ensuite, il supprime simplement cette clé de l'objet.

3voto

posit labs Points 1179

En général, lorsque vous ajoutez des éléments à un tableau, vous ne voulez pas présumer de la position à laquelle ils existeront. Au lieu de array[3] = 'e4' , faire array.push('e4') . Cela vous rendra la vie plus facile, et moins sujette aux insectes.

Comme vous devez associer des temps à chaque élément, il peut être judicieux d'utiliser des objets à la place des chaînes de caractères.

// create the array and push some objects into it
var array = []
array.push({createdAt: Date.now(), value: 'asdf'})
array.push({createdAt: Date.now(), value: 'asdf'})

Ensuite, dans un intervalle, vous pouvez vérifier la createdAt de chacun des objets et décidez si vous voulez les expulser du tableau.

var maxLifespan = 5000
// check once per second
setInterval(function checkItems(){
    array.forEach(function(item){
        if(Date.now() - maxLifespan > item.createdAt){
            array.shift() // remove first item
        }
    })
}, 1000)

Utilisation de array.shift() suppose que vous allez toujours pousser les nouveaux éléments à la fin du tableau, de sorte qu'ils seront toujours triés chronologiquement.

Si vous avez besoin que le tableau ne soit pas trié chronologiquement, alors vous devrez utiliser une méthode pour supprimer les éléments à un index spécifique dans un tableau (indice : PAS delete ). Utilisez array.splice pour y parvenir.

1voto

Azamantes Points 1253

Vous pouvez ajouter des éléments au tableau avec une fonction comme celle-ci :

function insert(array, element) {
    array.push(element);

    setTimeout(() => {
        const index = array.indexOf(element);
        if (index >= 0) {
            array.splice(index, 1);
        }
    }, 15000);
}

De cette façon, vous serez sûr que l'élément sera retiré après ~15 secondes, quoi qu'il arrive. Évidemment, cela fonctionnera correctement à 100 % avec les objets et les tableaux (types référentiels), mais si vous stockez des primitives comme des chaînes de caractères ou des nombres, si vous avez plus d'une valeur primitive de ce type dans le tableau, vous pouvez finir par supprimer l'autre copie de la valeur, mais au final, chaque élément est supprimé après ~15 secondes.

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