请问js原生提供固定长度数组的方法么?

donotloveshampo
  • 190

例子:

const arr = [1,2,3,4];
arr.push(5);
console.log(arr)//  [2,3,4,5];

像例子一样我希望数组长度是固定的,每次往其中增加新的元素,都自动将第一个推出去,请问js有原生方法支持吗?
现在我能想到的就是每次push,手动删除第一个元素。。。。。

回复
阅读 1.4k
5 个回答
Runningfyy
  • 1.2k
✓ 已被采纳

给三种思路吧
第一种 其他答案也写了 做一种新的数据结构 当length>=5 push方法中有shift操作
新定义的数据结构.push()
第二种思路
如果一定非要用数组这种结构。我们可以用AOP的思路 封装一个新的push方法,调用原生push的同时,额外添加一个删除的逻辑

Array.prototype._push = function(val){
    this.push(val)
    if(this.length===5) this.shift()
}
var a = [1,2,3,4]
a._push(5)
console.log(a)

第三种思路
如果你说 1.我非要要用原生数组 2.我就要用push方法 那就只能参考vue的思路了 重写一下push方法
vue里面的push 是添加元素的同时 触发响应式 那么vue是怎么实现的呢
原型链拦截
数组--原型链--自己定义的push--原型链--原生Push
响应式数组的push方法实际调用的是我们自己定义的push 自己定义的push又调用原生的push并夹杂响应式的逻辑。
其实和思路2有点像。
这个时候 [1,2,3,4].push(5) 应该能完美满足你的需求

js没原生方法,可以考虑自己写一个栈,push方法调用后,检查下长度,超出就推出第一个。

边城
  • 55k

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 初始化为 [] 就好

没有。

数组长度不固定,是JavaScript语言的特点。
不像后端的语言,如Java语言那样,是固定不变的。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏