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

时间:2015-06-24 09:51:44

标签: 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

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

BTW:在这种特殊情况下我使用角度。

9 个答案:

答案 0 :(得分:14)

覆盖缓存阵列的push功能。

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

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);

答案 1 :(得分:5)

要从数组中删除第一个元素,请使用shift

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

答案 2 :(得分:4)

这个对象怎么样?

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]

答案 3 :(得分:2)

您可以在Array.prototype中创建新方法来模仿您的需求。

Array.prototype.push_with_limit = function(element, limit){
  var limit = limit || 10;
  var length = this.length;
  if( length == limit ){
    this.shift();
  }
  this.push(element);
}

var arr = []
arr.push_with_limit(4); // [4]
arr.push_with_limit(9); // [4, 9]
....
// 11th element
arr.push_with_limit(3); // [9, ..., 3]  10 elements

答案 4 :(得分:2)

简单的固定长度队列:

if (b<10 && b>0 && a!=1 && a!=4)

答案 5 :(得分:1)

> let result'' = { result' with Id = 7 };;

val result'' : Identifiable<int> = {Id = 7;
                                    Value = 1337;}

答案 6 :(得分:1)

如果检查数组是否已达到10个带function myController($scope) { $scope.element = { "x": 350, "y": 50, "rotation": { "degree": 60, "x": 50, "y": 50 } }; var isDragging = false, x, y; $scope.elementMouseDown = function(eventArgs){ isDragging = true; x = eventArgs.clientX; y = eventArgs.clientY; }; $scope.mouseMove = function(eventArgs) { if(isDragging) { $scope.element.x += eventArgs.clientX - x; $scope.element.y += eventArgs.clientY - y; x = eventArgs.clientX; y = eventArgs.clientY; }; }; $scope.mouseUp = function() { isDragging = false; }; } 的条目,只需在推送新元素之前删除第一个元素。这可以通过多种方式完成,如图沙尔所说,array.length将是最快的,但你确实可以使用array.shift()

看起来像这样:

array.splice()

在旁注中,我建议你只使用if(array.length > 10) { array.shift(); array.push(getData(10)); } 而不是var array = new Array()。这是因为Javascript中的新关键字有时会产生不良副作用。例如,如果您想要创建一个数组,其中1个元素是数字,并且您使用var array = [];,则将创建一个包含12个未定义元素的数组。而var arr = new Array(12);将创建一个包含1个元素的数组,数字为12.

但我想这是一个需要考虑的小事。

答案 7 :(得分:1)

您可以改为使用对象......

var obj = {}; //your cache object
obj[window.performance.now()] = getData(val); //add value, index by microsecond timestamp
if(Object.keys(obj).length > 10){ // then if the length ever gets bigger than 10..
 var array = Object.keys(obj).sort(); //sort the properties by microsecond asc
 delete obj[array[0]]; //delete the oldest one   
}

这是一个jsFiddle示例,展示了它的工作原理:https://jsfiddle.net/uhkvk4mw/

答案 8 :(得分:0)

检查是否达到了长度然后弹出

if(arr.length > someNumber){
arr.pop(); // pop() will remove the last element
}