Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用自定义方法创建有限数组_Javascript_Arrays - Fatal编程技术网

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