我想在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:在这种特殊情况下我使用角度。
答案 0 :(得分:14)
覆盖缓存阵列的push
功能。
var array = new Array()
array.push = function (){
if (this.length >= 10) {
this.shift();
}
return Array.prototype.push.apply(this,arguments);
}
为了使这更加可重用,我创建了一个返回此类数组的新实例的方法(基于上面的代码)。
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
}