所以我有ID为int32从0到20000,我需要在JavaScript中的数组。所以这个阵列可能长达20,000个项目。Javascript:最有效的方法来存储20,000个数字ID并检查它们吗?
然后我需要检查几个ID以查看它们是否在该列表中。
什么是最有效的方法,所以我们不会崩溃浏览器的内存?
所以我有ID为int32从0到20000,我需要在JavaScript中的数组。所以这个阵列可能长达20,000个项目。Javascript:最有效的方法来存储20,000个数字ID并检查它们吗?
然后我需要检查几个ID以查看它们是否在该列表中。
什么是最有效的方法,所以我们不会崩溃浏览器的内存?
如果您想减少内存,请将数字存储在16位无符号整数的键入数组中,这将允许您存储包含0到65535的数字。
但是,搜索会很慢。 20000号码不会浪费过多的内存。
20000 * 64 bit = 1280000 bit = 160000 byte = 156.25 kibibyte
所以我会建议一个Set或一个对象。平均操作要求是次线性的。
var s = new Set();
s.add(id); // store id
s.has(id); // check id
s.delete(id); // remove id
s.size; // count ids
for(var id of s) {} // iterate ids, in insertion order
var s = Object.create(null);
s[id] = true; // store id
id in s; // check id
delete s[id]; // remove id
for(var id in s) {} // iterate stringified ids, in implementation-defined order
如果你的号码的范围是有限的,最有效的方法是将它们存储在打包位阵列,每个号码一位。该位阵列可以被表示为Uint8Array
,然后,检查数量N
是在阵列(=其位设置),计算
array[N >> 3] & (1 < (N & 7))
你尝试过什么?你能告诉我们一些代码吗? – tptcat
也许这个其他问题可能会有所帮助。它也指最有效的方法来检查一个对象是否可以在数组中找到。 http://stackoverflow.com/questions/237104/how-do-i-check-if-an-array-includes-an-object-in-javascript – Davis
20000的数组可能是NCSA Mosaic的问题,但我怀疑你今天会用任何浏览器“崩溃浏览器的内存”(不管这意味着什么) –