我想创建一个辅助对象,它将按以下方式工作:
它是一个具有给定行数的数组,例如,假设它只能容纳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对象本身的实例并将其修改为受限制等。
欢迎任何批评/改进建议!
答案 0 :(得分:2)
您可以覆盖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;
}
答案 1 :(得分:1)
这对我来说很好,但你可以使用array's unshift method将值添加到数组的开头,而不是手动更新所有数组。这会使它更紧凑。
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
this.arr.unshift(value);
this.arr.length = maxlength;
};
}
据我所知,没有内置的方法来定义数组的最大长度。