JavaScript对象属性计数限制,删除最旧的更新的

时间:2013-05-24 14:14:52

标签: javascript performance node.js express coffeescript

我想实现JavaScript对象的大小限制及其属性计数。我需要的是在将新属性添加到对象时删除最旧的更新版本。

考虑以下对象,其中我计算文本中每个字母的出现次数(但仅限于所见的2个最新字母):

var occurrences = {a: 1, d: 2}

当我阅读a时,我会将occurrences['a']增加一个。但在此之后,如果我看到h我必须删除d,因为它最近更新的时间不是a。然后,我的对象如下:

{a: 2, h: 1}

有充分的理由将对象用于此目的,因此我不能使用排序数组,例如,因为性能非常重要。

2 个答案:

答案 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,因为语言不能保证,但显然它也有效。