在超时Node.js上从数组中删除元素

时间:2016-09-23 21:36:02

标签: javascript arrays node.js

我有一个非常动态的数组,一直有新的元素,并且其他元素被删除。问题是有时候,在某些情况下,有些元素可能会永久保留在数组中这不是我想要的。应该在15秒内从数组中删除每个元素,否则,数组应该自动删除该元素。

例如,在下面的代码中,我们有一个包含三个元素的数组:

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

5秒后,我在数组中再添加2个元素:

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

现在,假设前3个元素在12:00:00 pm插入数组,第二个2个元素在12:00:05 pm插入。我想在12:00:15 pm删除前3个元素,在12:00:20 pm删除第2个元素......等等....

有没有关于如何解决这个问题的想法?

3 个答案:

答案 0 :(得分:3)

您需要存储对数值插入数组时的引用,以便能够在某个点删除它们。您可能希望使用纯JavaScript对象:



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);




基本上我将时间保存为键,将项目数组保存为值。 (单击"运行代码片段"上方以查看控制台输出以查看其行为)。

基本上我们设立了一个" cron job" (简单setInterval)每秒运行一次并检查密钥创建的时间是否少于14秒(不是15秒,因为cron作业每秒运行一次)。然后它只是从对象中删除该键。

答案 1 :(得分:3)

通常,当您向数组添加项目时,您不希望假定它们将存在于的位置。不是array[3] = 'e4',而是array.push('e4')。这将使您的生活更轻松,并且不易出错。

因为您需要将时间与每个项目相关联,所以最好使用对象代替字符串。

// 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'})

然后,在一个时间间隔内,您可以检查每个对象的createdAt值,并决定是否要将它们踢出阵列。

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)

使用array.shift()假设您始终将新项目推送到数组的末尾,因此它们将始终按时间顺序排序。

如果您需要对数组进行按时间顺序排序,那么您需要使用一种方法来删除数组中特定索引处的元素(提示:NOT delete)。使用array.splice来实现此目的。

答案 2 :(得分:1)

您可以使用如下函数向元素添加元素:

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

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

这样你就可以确保在15秒后删除元素,无论如何。显然它可以100%正确地使用对象/数组(引用类型),但如果你存储像字符串或数字这样的基元,那么如果你在数组中有超过1个这样的原始值,你最终可能会删除该值的另一​​个副本,但最终每个元素在约15秒后被移除。