gpt4 book ai didi

javascript - 使用自定义方法创建有限数组

转载 作者:行者123 更新时间:2023-11-30 13:30:28 24 4
gpt4 key购买 nike

我想创建一个按以下方式工作的辅助对象:
它是一个具有给定行数的数组,例如,假设它只能容纳 3 行。
它将有一个 insert 方法,在第一个索引处插入一个新条目,并将一个索引向下推到所有其余部分(新条目为 0,0 变为 1、1-->2 等。)
如果数组已满达到最大行数,则最后一个条目将被丢弃。

所以我采用了以下方式:

function limArray(array, maxlength){

this.arr = array;
this.maxlength = maxlength;
this.arr.length = maxlength;

this.insertVal = function(value){ //insert new value and push down the rest

for (var i=maxlength; i>=0; i--) {
this.arr[i] = this.arr[i-1]
};
this.arr[0] = value;
this.arr.length = maxlength;
};
}

我的问题是,这样做是否明智?
是否可以创建 Array 对象本身的实例并将其修改为受限等。
欢迎任何批评/改进建议!

最佳答案

你可以覆盖 push 方法:

function limArray(array, maxlength){
var push_ = array.push,
slice_ = [].slice;

array.push = function() {
var values = slice_.call(arguments, 0, maxlength - this.length);
return push_.apply(this, values);
}
return array;
}

作为@alnorth29 mentioned ,您可以使用 unshift 来添加一个值。您也可以覆盖它:

function limArray(array, maxlength){
// push like above
var unshift_ = array.unshift;
array.unshift = function() {
unshift_.apply(this, arguments);
this.length = this.length > maxlength ? maxlength : this.length;
return this.length;
}

return array;
}

当然你也可以附加一个比unshift更具表现力的名称的新属性:

array.prepend = array.unshift;

如果你像这样扩展一个数组实例,确保你只用 for 循环遍历它的元素,而不是用 for...in 循环(你无论如何应该始终对数组使用 for)。另一种可能性是使用 ECMAScript 5 的 Object.defineProperty [docs] 定义属性。并将 enumerable 设置为 false。但它仅在较新的浏览器中受支持。

还有其他方法可以将元素添加到数组,但我假设您不会使用它们。

用法:

> var limited = limArray([], 3);
> limited.push(1,2,3,4);
3
> limited
[1, 2, 3]
> limited.push(5)
3
> limited
[1, 2, 3]

> var limited = limArray([], 3);
> limited.unshift(3, 4)
2
> limited
[3, 4]
> limited.unshift(1, 2)
3
> limited
[1, 2, 3]

更新:

我忘了,万一传递给函数的数组已经超过最大元素数,你必须减少长度:

function limArray(array, maxlength){
array.length = array.length > maxlength ? maxlength : array.length;
//...

return array;
}

关于javascript - 使用自定义方法创建有限数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6954042/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com