gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 23:43:28 25 4
gpt4 key购买 nike

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

考虑以下对象,我在其中计算文本中每个字母(但仅针对最近看到的 2 个字母)的出现次数:


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

当我读取 a 时,我会将 occurrences['a'] 加一。但在那之后,如果我看到 h,我必须删除 d,因为它比 a 最近更新得少。那么,我的对象将是:


{a: 2, h: 1}

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

最佳答案

确定“最旧”的唯一可靠方法是保留某种索引,可能使用数组。每当您更新对象时,您都会使用 propertyName in Object 检查该属性是否存在。如果是,则从数组中拼接它并使用 unshift 将其放在索引 0 处,然后更新其在对象上的值。

如果它不存在,并且数组长度等于最大属性数,弹出数组中最旧的属性名称,unshift新属性到索引 0,删除对象中的旧属性并添加新属性。

如果它不存在并且数组长度小于最大属性计数,unshift 数组上的名称以将其添加到索引 0 并将其添加到对象。

编辑

一些代码。请注意,您需要防止覆盖 *_maxPropCount* 和 *_index* 属性,我会把它留给您。

var o = {a:1, b:2, _maxPropCount: 2, _index: ['a','b']};

function updateObject(obj, prop, value) {
var idx = obj._index;
var i, lastProp;

// If property exists, move to start of index array
if (prop in obj) {
i = idx.indexOf(prop);
idx.unshift(idx.splice(i, 1));

// Otherwise, property doesn't exist so check length and
// number of properties
} else {

// If already have full count, pop last property name from end of array
// and delete from object
if (idx.length == o._maxPropCount) {
lastProp = idx.pop();
delete o[lastProp];
}

// Update index
idx.unshift(prop);
}

// Update object
obj[prop] = value;
}

updateObject(o, 'b', 6);
alert(o._index + ' ' + o.b); // b,a 6

updateObject(o, 'g', 2);
alert(o._index + ' ' + o.a); // g,b undefined

代码可以缩短几行,但这不会让它变得更快。哦,indexOf 是 ES5,因此在旧版浏览器上不可用,需要一个 shim,如果您有很多属性,这对于需要使用它的 UA 来说会很慢。

关于JavaScript 对象属性计数限制,删除最早更新的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16737062/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com