Javascript 数组查找对象或元组
Javascript Array find Object or tuple
我正在为地图上的某些 "elements" 构建移动逻辑。
我有由它们的 X 和 Y 位置定义的图块,现在我需要将一个元素分配给图块。
一般而言,我想做这样的事情:[0,1] => ElementX,然后将其存储到 "something".
然而,对于 JavaScript 数组,我无法执行 "something".indexOf [0,1] 或 ElementX(其对象)或事件 ElementXId。
所以我最后做的是:
TileVector["" + x + y] = [x,y] //translates to TileVector["6060"] = [60,60]
和
TileElementVector["" + x + y] = ElementX;
现在,当我想查看特定坐标上的内容时,我只需将 x 和 y 坐标串起来。
我只是想知道这有多糟糕或有多慢,以及是否还有其他解决方案。
谢谢。
我将详细说明它是如何使用的。
创建了一个 200 x 200 的地图,其中包含 1 像素的图块。为了将每个图块映射到特定的 id(以便快速访问),我创建了一个这样的数组:TileVector[""+x+y] = [x+y] 正如指出的那样,这不是防弹的
现在,当一个元素被放置在地图上时,我需要将该元素与地图上的那个位置相关联,因此 [x+y] => 元素并将其存储在一个全新的数组中。
下面有什么问题吗?
TileElementVector[x][y]
您必须像这样初始化数组的两个维度:
TileElementVector = [];
for (var i = 0; i < maxY; i++){
TileElementVector[i] = [];
}
其中 maxY
只是 Y 在这个假设的二维网格中可以取的最大值。
在速度方面,none 这是一个真正的问题。但是如果你真的想要一维存储数组,你可以使用这个巧妙的数学技巧:
TileElementVector[x * maxY + y]
这将确保每个元素都有一个唯一的索引。这本质上是 "flattening" 数组。但是,由于使用起来有点棘手,我推荐第一种解决方案。
function toIndex(x, y, rowSize) {
return y * rowSize + x;
}
function fromIndex(idx, rowSize) {
return {
x: idx % rowSize,
y: Math.floor(idx / rowSize)
};
}
var colSize, rowSize;
var TileElementVector = new Array(colSize * rowSize);
var tileIdx = toIndex(xTile, yTile, rowSize);
var coords = fromIndex(tileIdx, rowSize);
coords.x == xTile && coords.y == yTile;
我正在为地图上的某些 "elements" 构建移动逻辑。 我有由它们的 X 和 Y 位置定义的图块,现在我需要将一个元素分配给图块。 一般而言,我想做这样的事情:[0,1] => ElementX,然后将其存储到 "something".
然而,对于 JavaScript 数组,我无法执行 "something".indexOf [0,1] 或 ElementX(其对象)或事件 ElementXId。
所以我最后做的是:
TileVector["" + x + y] = [x,y] //translates to TileVector["6060"] = [60,60]
和
TileElementVector["" + x + y] = ElementX;
现在,当我想查看特定坐标上的内容时,我只需将 x 和 y 坐标串起来。
我只是想知道这有多糟糕或有多慢,以及是否还有其他解决方案。
谢谢。
我将详细说明它是如何使用的。 创建了一个 200 x 200 的地图,其中包含 1 像素的图块。为了将每个图块映射到特定的 id(以便快速访问),我创建了一个这样的数组:TileVector[""+x+y] = [x+y] 正如指出的那样,这不是防弹的
现在,当一个元素被放置在地图上时,我需要将该元素与地图上的那个位置相关联,因此 [x+y] => 元素并将其存储在一个全新的数组中。
下面有什么问题吗?
TileElementVector[x][y]
您必须像这样初始化数组的两个维度:
TileElementVector = [];
for (var i = 0; i < maxY; i++){
TileElementVector[i] = [];
}
其中 maxY
只是 Y 在这个假设的二维网格中可以取的最大值。
在速度方面,none 这是一个真正的问题。但是如果你真的想要一维存储数组,你可以使用这个巧妙的数学技巧:
TileElementVector[x * maxY + y]
这将确保每个元素都有一个唯一的索引。这本质上是 "flattening" 数组。但是,由于使用起来有点棘手,我推荐第一种解决方案。
function toIndex(x, y, rowSize) {
return y * rowSize + x;
}
function fromIndex(idx, rowSize) {
return {
x: idx % rowSize,
y: Math.floor(idx / rowSize)
};
}
var colSize, rowSize;
var TileElementVector = new Array(colSize * rowSize);
var tileIdx = toIndex(xTile, yTile, rowSize);
var coords = fromIndex(tileIdx, rowSize);
coords.x == xTile && coords.y == yTile;