我有一定的要求,我想以最快的方式完成以下工作。
- 我有1000的对象如下
{id:1,value:"value1"} . . {id:1000,value:"value1000"}
- 我想通过id 访问上述对象
- 我想每隔几分钟清理小于特定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来重新创建数组。