【问题标题】:Javascript foreach with condition带有条件的 Javascript foreach
【发布时间】:2013-11-17 15:31:42
【问题描述】:

在这里你可以看到我的代码:

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 中的每个图块,我都会进行一些计算。

我的数组中的每个项目都有一个属性posXposY

我的问题是如果我的数组中有很多图块,这个 foreach 需要很长时间才能执行。

我需要为 posX 介于 Xmin 和 Xmax 之间的每个图块添加条件并执行此操作,对于 posY 也是如此。

我怎样才能尽可能简单地做到这一点?为了节省尽可能多的资源......谢谢!

在我的数组中添加一个 if 条件不是一个好的解决方案,因为 foreach 仍然会遍历整个数组..

【问题讨论】:

  • forEach 无论如何都会遍历整个数组。尝试在该函数内的 3 行代码周围添加一个 if 表达式,以检查您在 $tile.posX 中的所需范围
  • 你能举一个你的数组的例子吗?

标签: javascript performance foreach


【解决方案1】:

您可以使用filter 方法:

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-loop 会更有效:

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;
    }
}

【讨论】:

  • 很好,感谢 .filter。但是你认为 for 循环更高效?
  • @ClémentAndraud for 循环通常更有效,因为调用函数很昂贵
  • 你能用JS Perf 证明for 循环相对于filter().forEach() 数组方法的效率提高了吗?
  • @ClémentAndraud .filter 循环遍历tiles 中的每一项并构造一个新数组,然后.forEach 循环遍历结果数组中的每一项。使用简单的 for 循环可以让您不必构造新数组或不必要的函数调用。
猜你喜欢
  • 2012-04-23
  • 2021-09-23
  • 2019-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多