如何移除二维数组最旧元素?实现数组大小限制至20的方法
正确限制二维数组大小为20的实现方式
我来帮你分析下问题所在,然后给出靠谱的解决办法~
首先看你原来代码的两个核心问题:
- 触发时机不对:你只在
iteration % 20 === 0时执行移除操作,但这时候数组可能已经远超20个元素了(比如每次iteration都往数组里加元素,到iteration=21时数组已经21个了,但你的代码要等到iteration=20才执行,中间数组会持续增长)。 - splice用法错误:
rawData.splice(1)会删除从索引1到数组末尾的所有元素,返回这些被删元素,你把rawData赋值为这个返回值——这相当于把数组变成原数组从第二个元素开始的部分,而不是移除最旧的第一个元素。比如原数组有20个元素,执行后会变成19个,之后push又回到20,下次触发时又变成19,数组大小一直在波动,根本没限制住最大长度。
正确的实现思路
应该在每次向数组添加元素之后,立即检查数组长度:如果超过20,就移除最旧的元素(也就是数组的第一个元素)。这样不管数组怎么增长,都能始终保持最多20个元素。
方法一:每次push后检查并移除(最直观)
// 假设你添加新元素的代码是这样的 rawData.push([newTimestamp, newValue]); // 添加后立刻检查长度,超过20就删掉最旧的第一个元素 if (rawData.length > 20) { rawData.shift(); // shift()专门移除数组第一个元素,返回被移除的值 }
方法二:一次性移除所有多余元素(更灵活)
如果有时候会一次性添加多个元素,或者担心数组长度突然超过20很多,可以用splice一次性清理所有多余的旧元素:
rawData.push([newTimestamp, newValue]); // 如果长度超过20,计算需要删除的数量,从索引0开始删 if (rawData.length > 20) { rawData.splice(0, rawData.length - 20); }
比如数组长度是25,rawData.length - 20就是5,这会直接删除前5个最旧的元素,把数组长度拉回20。
替换你的错误代码
把你原来这段代码:
//Remove first if(iteration % 20 === 0) { rawData = rawData.splice(1); }
替换成上面两种方法中的任意一种,放在你向rawData添加新元素的代码之后,就能完美限制数组大小为20了。
内容的提问来源于stack exchange,提问作者user9252059




