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

时间:2011-08-05 09:17:26

标签: javascript arrays

我想创建一个辅助对象,它将按以下方式工作:
它是一个具有给定行数的数组,例如,假设它只能容纳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对象本身的实例并将其修改为受限制等。
欢迎任何批评/改进建议!

2 个答案:

答案 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;
    };
}

据我所知,没有内置的方法来定义数组的最大长度。