根据ID访问和删除对象



我有一定的要求,我想以最快的方式完成以下工作。

  1. 我有1000的对象如下{id:1,value:"value1"} . . {id:1000,value:"value1000"}
  2. 我想通过id
  3. 访问上述对象
  4. 我想每隔几分钟清理小于特定id的对象(因为它每秒为我的高频算法生成1000个对象)

我可以很容易地用这个清洁。

myArray = myArray.filter(function( obj ) {
return obj.id > cleanSize;
});

我可以通过id使用

找到对象
myArray.find(x => x.id === '45');

问题在这里,我觉得当有更大的数据集时,find有点慢。所以我创建了一些对象的对象,比如

const id = 22;
myArray["x" + id] = {};
myArray["x" + id] = { id: id, value:"test" };

所以我可以通过myArray[x22]轻松访问我的项目id;,但问题是我无法找到通过id删除旧项目的方法。

谁来指导我更好地使用数组或对象来实现我上面提到的三点。

你的问题的问题是,你要求一种方法来完成一个算法,应该解决你的问题,但我认为有一些根本错误的问题开始:)

如果您存储了相当数量的数据记录,每个数据记录都与一个ID相关联,并允许您的代码自由访问它们,那么您就不能让代码的另一部分突然将其中的一些转储到bin中(例如,从某个计时器回调中),仅仅因为它们变得"太旧"。在删除它们之前,您必须确保没有人还在处理它们(并且将永远需要)。

如果你没有显式地同步记录的创建和删除,你可能会得到一个代码,它碰巧工作(因为你的对象碰巧处理得足够快,永远不会过早删除),但很可能随时中断(如果你的处理时间增加,你的数据变得"太旧")。

在浏览器上下文中尤其如此。您的代码应该在任何连接到互联网的计算机上运行,这可能有几十个原因导致运行速度比您测试代码的机器慢10倍或100倍。因此,假设成千上万条记录的处理时间是在自找麻烦。

如果没有进一步的说明,在我看来,回答你的问题就像帮你完成一把只会让你射自己脚的枪:)

说了这么多,任何JavaScript对象本质上都能完全满足您的要求,只要您可以使用字符串作为id,因为对象属性名称也可以用作关联数组中的索引。

var associative_array = {}
var bob = { id:1456, name:"Bob" }
var ted = { id:2375, name:"Ted" }
// store some data with arbitrary ids
associative_array[bob.id] = bob
associative_array[ted.id] = ted
console.log(JSON.stringify(associative_array)) // Bob and Ted
// access data by id
var some_guy = associative_array[2375] // index will be converted to string anyway
console.log(JSON.stringify(some_guy)) // Ted
var some_other_guy = associative_array["1456"]
console.log(JSON.stringify(some_other_guy)) // Bob
var some_AWOL_guy = associative_array[9999]
console.log(JSON.stringify(some_AWOL_guy)) // undefined
// delete data by id
delete associative_array[bob.id] // so long, Bob
console.log(JSON.stringify(associative_array)) // only Ted left

虽然我怀疑速度是否真的是个问题,但这种机制与JavaScript运行的速度一样快,因为底层数据结构是一个哈希表,理论上是0(1)。

任何涉及数组方法,如find()filter(),将至少运行0 (n)。
此外,每次调用filter()都会浪费内存和CPU来重新创建数组。

最新更新