Javascript 使用自定义方法创建有限数组
我想创建一个助手对象,该对象将按以下方式工作:Javascript 使用自定义方法创建有限数组,javascript,arrays,Javascript,Arrays,我想创建一个助手对象,该对象将按以下方式工作: 它是一个具有给定行数的数组,例如,假设它只能容纳3行。 它将有一个insert方法,该方法在第一个索引处插入一个新条目,并将一个索引向下推所有其余的索引(新条目为0,0变为1,1-->2等) 如果数组已满到最大行数,则最后一个条目将退出。 因此,我采取了以下方式: function limArray(array, maxlength){ this.arr = array; this.maxlength = maxlength;
它是一个具有给定行数的数组,例如,假设它只能容纳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;
};
}
我的问题是,这样做是否明智?是否可以创建数组对象本身的实例并将其修改为受限等…
欢迎提出任何批评/改进建议 我觉得这很好,不过您可以使用将值添加到数组的开头,而不是手动更新所有值。这将使它更紧凑
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;
};
}
据我所知,没有内置的方法来定义数组的最大长度。您可以覆盖
推送方法:
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;
}
如图所示,您可以使用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定义属性,并将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;
}
op希望有一个方法在数组的开头插入值,而不是在数组的结尾。@alnorth29:更新了我的答案。@Felix Kling thanx获取详细答案!为什么要给main和内部函数一个返回值
,而不是像我那样将数组保存在一个内部变量中?@IlyaD:在我的例子中,limArray
不是构造函数。它只需要一个数组,并通过重写方法将其设置为有限数组。方法替换返回与原始方法相同的值(push
和unshift
)。为了方便起见,我从limArray
返回array
。您也可以这样做:var-arr=[];直线阵列(arr,5)
如果数组长度超过maxlength
,则只应将this.arr.length
设置为maxlength
。