Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/438.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带条件的Javascript foreach_Javascript_Performance_Foreach - Fatal编程技术网

带条件的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émentAndraud
for
循环通常更有效,因为调用一个函数是昂贵的。你可以演示
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;
    }
}