当数组达到特定长度时,删除javascript数组的最后一个元素

wal*_*ros 13 javascript arrays angularjs

我想在javascript中缓存一些数据,但缓存应限制为10个元素.

我可以将对象放在javascript数组中,但是将数组限制为10个元素的最佳方法是什么?

例:

function getData(dataId) { return new NextDataObject(dataId); }

var array = new Array();

array.push(getData(0));
array.push(getData(1));
(...)
array.push(getData(10)); // this should result in dropping "oldest" data, so getData(0) should be removed from the array, so that in array there are only 10 objects at maximum
Run Code Online (Sandbox Code Playgroud)

应该手动编写这样的机制(例如使用splice()吗?)还是有更好的方法在javascript中实现这种"缓存"结构?

顺便说一句:在这种特殊情况下,我正在使用棱角分明.

Mic*_*ael 17

覆盖push缓存数组的功能.

var array = new Array()
array.push = function (){
    if (this.length >= 10) {
        this.shift();
    }
    return Array.prototype.push.apply(this,arguments);
}
Run Code Online (Sandbox Code Playgroud)

Plunker


为了使这更可重用,我创建了一个返回此类数组的新实例的方法(基于上面的代码).

function getArrayWithLimitedLength(length) {
    var array = new Array();

    array.push = function () {
        if (this.length >= length) {
            this.shift();
        }
        return Array.prototype.push.apply(this,arguments);
    }

    return array;

}

var array = getArrayWithLimitedLength(10);
Run Code Online (Sandbox Code Playgroud)

  • 我不认为这是最好的方法,因为如果他有另一种情况,阵列CAN超过10的长度,push()仍会将其限制为10 .. (2认同)
  • @Michael你想使用`shift`而不是`unshift`. (2认同)

A F*_*kly 8

这个对象怎么样?

function Cache(maxLength) {
  this.values = [];

  this.store = function(data) {
    if(this.values.length >= maxLength) {
      this.getLast();
    }
    return this.values.push(data);
  }

  this.getLast = function() {
    return this.values.splice(0,1)[0];
  }
}

cache = new Cache(3);
// => Cache {values: Array[0]}
cache.store(1)
// => 1
cache.store(2)
// =>2
cache.store(3)
// => 3
cache.store(4)
// =>3
cache.values
// => [2, 3, 4]
cache.getLast()
// => 2
cache.values
[3, 4]
Run Code Online (Sandbox Code Playgroud)


Tus*_*har 5

要从数组中删除第一个元素shift:

if (arr.length > 10) {
    arr.shift(); // removes the first element from an array 
}
Run Code Online (Sandbox Code Playgroud)

  • @Tushar,我猜你的第二个答案是不正确的,它实际上是"转移",这有助于我们删除第一个元素. (2认同)