我想实现JavaScript对象的大小限制及其属性计数。我需要的是在将新属性添加到对象时删除最旧的更新版本。
考虑以下对象,其中我计算文本中每个字母的出现次数(但仅限于所见的2个最新字母):
var occurrences = {a: 1, d: 2}
当我阅读a
时,我会将occurrences['a']
增加一个。但在此之后,如果我看到h
我必须删除d
,因为它最近更新的时间不是a
。然后,我的对象如下:
{a: 2, h: 1}
有充分的理由将对象用于此目的,因此我不能使用排序数组,例如,因为性能非常重要。
答案 0 :(得分:3)
确定“最老”的唯一可靠方法是保留某种索引,可能使用数组。每当您更新对象时,都会使用propertyName in Object
检查属性是否存在。如果是这样,将它从数组中拼接出来并使用unshift将其放在索引0处,然后在对象上更新它的值。
如果它已经不存在,并且数组长度等于max属性count,pop
数组中最旧的属性名称,unshift
将索引为0的新属性{{1}来自对象的旧属性并添加新属性。
如果它不存在且数组长度小于最大属性数,delete
数组上的名称将其添加到索引0并将其添加到对象。
一些代码。请注意,您需要防止覆盖* _maxPropCount *和* _index *属性,我会留给您。
unshift
代码可以缩短几行,但这不会使它更快。哦,并且 indexOf 是ES5,因此在旧浏览器上不可用,需要垫片,如果你有很多属性,需要使用它的UA会很慢。
答案 1 :(得分:1)
如果您在node.js中,则可以利用对象属性的一个令人惊讶的功能:它们按照添加顺序返回。所以你可以定义一个具有一些属性的对象:
var array = { fake1: 'fake', fake2: 'fake' };
然后每次添加新属性时,都会删除第一个:
for (var i in array) {
delete array[i];
break;
}
更新属性时,必须将其删除,然后重新添加,使其再次结束。
这很简单但非常有效:您将始终在对象中拥有最新的两个属性。每次操作元素时,都不需要保留额外数据或遍历属性集。
我没有使用浏览器内的JavaScript引擎进行测试;你不应该依赖order of properties,因为语言不能保证,但显然它也有效。