我想知道使用包含大约10万个元素(属性)的数组(或对象)是否会在使用indexOf,slice等频繁访问它们时导致浏览器出现性能或内存问题。是否有一些建议可以使用大数组现代浏览器?
我的具体案例。我有以下结构:
tack01:[平均数10 000个元素] ... tack0n:[平均数10 000的元素数组]
曲目平均金额为10。
元素看起来像{id:“xa432fds”,某些属性}
在运行时期间,我需要访问任何知道提供它的id的元素。
如果我在没有转换的情况下使用此结构,我需要在所有轨道上执行搜索,并使用indexOf查找带有Id的元素。
所以我希望创建一个具有以下结构的索引对象: indexObj = {id1:对具有id1的元素的引用,id2:对具有id2的元素的引用}
访问我只需要访问indexObj [id]的某个元素,对我的情况来说是正确的解决方案吗?
所有这一切都应该在客户端进行。
答案 0 :(得分:21)
这是一个非常广泛的问题。
我要说的主要建议是真正深入了解你的工作内容。 JavaScript aren't really arrays at all中的数组,它们是具有JavaScript常规对象的所有正常管道的对象。数组索引不是数字,不是偏移到某些内存表*;它们是字典式地图中的字符串键。一旦你接受了数组只是对象的事实,它可能会开辟构建或访问数据的新方法,这样你就可以避免昂贵的操作,如indexOf
。
(*当然,禁止JavaScript引擎优化。)
更新:查看您的编辑,是的,转换数据以便您可以使用id
作为属性名称(indexObj[id]
)来查找曲目我推荐。然后,代替indexOf
所需的昂贵的线性搜索,您可以获得JavaScript引擎处理属性名称的好处,这通常是一种更有效的查找(b树和/或哈希结构等)。 )。
创建索引版本后,如果可以释放阵列版本,则阵列使用的内存及其属性名称("0"
,"1"
等)可以符合条件回收,这可能很有用(您的个别曲目将保留在内存中,因为您从索引结构中引用它们)。