我有一个非常动态的数组,一直有新的元素,并且其他元素被删除。问题是有时候,在某些情况下,有些元素可能会永久保留在数组中这不是我想要的。应该在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个元素......等等....
有没有关于如何解决这个问题的想法?
答案 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秒后被移除。