例子:
const arr = [1,2,3,4];
arr.push(5);
console.log(arr)// [2,3,4,5];
像例子一样我希望数组长度是固定的,每次往其中增加新的元素,都自动将第一个推出去,请问js有原生方法支持吗?
现在我能想到的就是每次push,手动删除第一个元素。。。。。
例子:
const arr = [1,2,3,4];
arr.push(5);
console.log(arr)// [2,3,4,5];
像例子一样我希望数组长度是固定的,每次往其中增加新的元素,都自动将第一个推出去,请问js有原生方法支持吗?
现在我能想到的就是每次push,手动删除第一个元素。。。。。
JS 的数据兼容了列表、队列和栈
push
,推一个在后面,就是 append 的意思pop
,从后面拉走,配合 push 就是栈unshift
,从前面加一个数据,就是 insert(it, 0) 的意思shift
,前面拉个数据走,配合 shift 就是一个反向栈,配合 push 就是队列所以你要干的事情就是 push,同时 unshift,可以把这两个操作封装在一个函数里。
不过如果你想做循环队列,也可以用一个数组 + 指针来完成
下面给个指针简单的示例(不过用指针来实现居然性能高一点,但是写起来复杂)
class CircleQueue {
#data;
#capacity;
#index = 0;
constructor(capacity) {
this.#data = Array(capacity);
this.#capacity = capacity;
}
push(el) {
this.#data[this.#index] = el;
this.#index = (this.#index + 1) % this.#capacity;
}
get data() {
return this.#data;
}
}
var q = new CircleQueue(4);
for (let i = 0; i < 10; i++) {
q.push(i);
console.log(q.data);
}
[ 0, <3 empty items> ]
[ 0, 1, <2 empty items> ]
[ 0, 1, 2, <1 empty item> ]
[ 0, 1, 2, 3 ]
[ 4, 1, 2, 3 ]
[ 4, 5, 2, 3 ]
[ 4, 5, 6, 3 ]
[ 4, 5, 6, 7 ]
[ 8, 5, 6, 7 ]
[ 8, 9, 6, 7 ]
如果不想要 empty items,#data
初始化为 []
就好
10 回答11.1k 阅读
6 回答3k 阅读
5 回答4.8k 阅读✓ 已解决
4 回答3.1k 阅读✓ 已解决
2 回答2.6k 阅读✓ 已解决
3 回答5.1k 阅读✓ 已解决
3 回答1.8k 阅读✓ 已解决
给三种思路吧
第一种 其他答案也写了 做一种新的数据结构 当length>=5 push方法中有shift操作
新定义的数据结构.push()
第二种思路
如果一定非要用数组这种结构。我们可以用AOP的思路 封装一个新的push方法,调用原生push的同时,额外添加一个删除的逻辑
第三种思路
如果你说 1.我非要要用原生数组 2.我就要用push方法 那就只能参考vue的思路了 重写一下push方法
vue里面的push 是添加元素的同时 触发响应式 那么vue是怎么实现的呢
原型链拦截
数组--原型链--自己定义的push--原型链--原生Push
响应式数组的push方法实际调用的是我们自己定义的push 自己定义的push又调用原生的push并夹杂响应式的逻辑。
其实和思路2有点像。
这个时候 [1,2,3,4].push(5) 应该能完美满足你的需求