这更多的是关于语言内部工作原理的一般性问题。我想知道javascript如何获取索引的值。例如,当您写array[index]
时它会循环遍历数组直到找到它吗?或者通过其他方式?我问的原因是因为我编写了一些代码,在其中循环数组以匹配值并在网格上查找点,我想知道通过创建像 array[gridX][gridY]
这样的数组是否会提高性能或者是否会有所作为。我现在正在做的是遍历具有网格点作为属性的对象的平面数组,如下所示:
var array = [{x:1,y:3}];
然后循环并使用对象属性中的这些坐标来识别和使用对象中包含的值。
我的想法是,通过实现多维网格,它将更直接地访问它们,因为可以通过说 array[1][3]
来指定网格点而不是循环执行:
for ( var a = 0; a < array.length; a += 1 ){
if( array[a].x === 1 && array[a].y === 3 ){
return array[a];
}
}
或者类似的东西。
任何见解将不胜感激,谢谢!
最佳答案
For example when you write array[index] does it loop through the array till it finds it? or by some other means?
这是实现定义的。 Javascript 可以同时拥有数字和字符串键,并且第一个 Javascript 实现确实通过这种缓慢的循环来访问内容。
然而,如今大多数浏览器都更加高效,并将数组存储为两部分,一个用于数字索引的压缩数组和一个用于其余部分的哈希表。这意味着访问数字索引(对于没有孔的密集数组)是 O(1),而访问字符串键和稀疏数组是通过哈希表完成的。
I am wondering if performance would be increased by creating and array like array[gridX][gridY] or if it will make a difference. what I am doing now is going through a flat array of objects with gridpoints as properties like this
array[{x:1,y:3}]
使用二维数组。这是一个更简单的解决方案,并且很可能对您来说足够高效。
这样做的另一个原因是,当您使用对象作为数组索引时,实际发生的情况是将对象转换为字符串,然后将该字符串用作哈希表键。所以array[{x:1,y:3}]
实际上是array["[object Object]"]
。如果您确实想要,您可以重写 toString 方法,这样并非所有网格点都序列化为相同的值,但我认为这不值得这么麻烦。
关于javascript - javascript 如何移动到数组中的特定索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30376362/