带条件的Javascript foreach
在这里您可以看到我的代码:带条件的Javascript foreach,javascript,performance,foreach,Javascript,Performance,Foreach,在这里您可以看到我的代码: this.tiles.forEach ( function($tile) { $tile.content.x = ( $tile.posY - $tile.posX ) * ($tile.map.tilesWidth/2) + ($tile.offsetX + $tile.map.offsetX); $tile.content.y = ( $tile.posY + $tile.posX ) * ($tile.ma
this.tiles.forEach ( function($tile)
{
$tile.content.x = ( $tile.posY - $tile.posX ) * ($tile.map.tilesWidth/2) + ($tile.offsetX + $tile.map.offsetX);
$tile.content.y = ( $tile.posY + $tile.posX ) * ($tile.map.tilesHeight/2) + ($tile.offsetY + $tile.map.offsetY);
$tile.content.tile = $tile;
});
因此,对于数组tiles
中的每个tile,我进行一些计算
我的数组中的每个项都有一个属性posX
和posY
我的问题是,如果我的数组中有很多分片,那么这个foreach需要很长时间才能执行
我需要添加一个条件,并对posX位于Xmin和Xmax之间的每个磁贴执行这些操作,对于posY也是如此
我怎样才能做到尽可能简单?以节省尽可能多的资源。。谢谢
在我的数组中添加if条件不是一个好的解决方案,因为foreach仍将遍历整个数组。您可以使用以下方法:
无论发生什么情况,
forEach
都会遍历整个数组。尝试在该函数内的3行代码周围添加一个if
表达式,以检查$tile.posX
中所需的范围。能否给出数组示例?很好,谢谢.filter。但是你认为for循环更有效吗?@ClémentAndraudfor
循环通常更有效,因为调用一个函数是昂贵的。你可以演示for
循环相对于filter()的效率提高。forEach()
数组方法,也许?@ClémentAndraud。filter
循环遍历tiles
中的每个项目并构造一个新数组,然后。forEach
循环遍历结果数组中的每个项目。使用简单的for循环可以避免构造新数组或不必要的函数调用。
this.tiles
.filter ( function($tile)
{
return $tile.posX <= Xmin && $tile.posX >= Xmax &&
$tile.posY <= Ymin && $tile.posY >= Ymax;
})
.forEach ( function($tile)
{
$tile.content.x = ( $tile.posY - $tile.posX ) * ($tile.map.tilesWidth/2) + ($tile.offsetX + $tile.map.offsetX);
$tile.content.y = ( $tile.posY + $tile.posX ) * ($tile.map.tilesHeight/2) + ($tile.offsetY + $tile.map.offsetY);
$tile.content.tile = $tile;
});
for (var i = 0; i < this.tiles.length; i++)
{
var $tile = this.tiles[i];
if ($tile.posX <= Xmin && $tile.posX >= Xmax &&
$tile.posY <= Ymin && $tile.posY >= Ymax)
{
$tile.content.x = ( $tile.posY - $tile.posX ) * ($tile.map.tilesWidth/2) + ($tile.offsetX + $tile.map.offsetX);
$tile.content.y = ( $tile.posY + $tile.posX ) * ($tile.map.tilesHeight/2) + ($tile.offsetY + $tile.map.offsetY);
$tile.content.tile = $tile;
}
}