2013-11-17 3 views
3

Здесь вы можете увидеть мой код:Javascript Еогеасп с условием

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 я сделать некоторую calculs.

Каждый элемент в моем массиве имеет атрибут posX и posY.

Моя проблема здесь, если у меня много плиток в моем массиве, этот foreach занимает много времени, чтобы выполнить.

Мне нужно добавить условие и сделать это для каждой плитки, где posX находится между Xmin и Xmax, то же самое для posY.

Как я могу сделать это как можно проще? Чтобы сохранить максимально возможный ресурс .. спасибо!

Добавить а, если условие в моем массиве не является хорошим решением причины Еогеаспа будет еще пройти через весь массив ..

+0

'forEach' проходит через весь массив, несмотря ни на что. Попробуйте добавить выражение 'if' вокруг трех строк кода внутри этой функции, которая проверяет ваш желаемый диапазон в' $ tile.posX' –

+0

Можете ли вы привести пример своего массива? –

ответ

4

Вы можете использовать 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; 
    } 
} 
+0

Ницца, спасибо за .фильтр. Но вы считаете, что цикл for более эффективен? –

+0

@ ClémentAndraud 'for' loops, как правило, более эффективны, потому что вызов функции дорог – Oriol

+0

Можете ли вы продемонстрировать улучшенную эффективность цикла' for' в отличие от 'array(). ForEach()' array-methods, с [ JS Perf] (http://jsperf.com/), может быть? –

Смежные вопросы