首页 > 解决方案 > 同时访问数组的所有元素

问题描述

我有两个包含一个圆形对象和一个墙对象的数组..

const allCircles = [circle1, circle2, circle3, circle4]; //
const allFunnelWalls = [funnelBottomLeft, funnelBottomRight, funnelLeft, funnelRight];

我有一个名为 collide 的函数,它接受两个数组作为参数,到目前为止,我让它适用于一个圆圈和墙壁,因为它使用相同的“i”索引访问两个数组中的元素我如何创建它以便我可以同时访问 allFunnelWalls 数组中的所有元素并针对每个圆圈进行测试?我尝试使用嵌套 for 循环的数组中的 every() 方法。我已经走到尽头了..帮助将不胜感激

function collide(array, array2){

    for(i = 0; i < array.length; i++){

        // Collision detection algorithm between circles + inner walls
        let collision = lineCircle(array2[i].x, array2[i].y, array2[i].x2, array2[i].y2,
        array[i].x, array[i].y, array[i].radius);

        // Collision detection
        if(collision){
          array[i].colour = "green";
          array[i].xSpeed = 0;
          array[i].ySpeed = 0;
          return true;
        }else{
          array[i].colour = "red";
          return false;
        }
    }
}

标签: javascriptarrays

解决方案


你可以试试嵌套地图。

function collide(array, array2) {
  let results =  array.map(circle => {
    return array2.map(wall => {
      // Collision detection algorithm between circles + inner walls
      let collision = lineCircle(wall.x, wall.y, wall.x2, wall.y2,
         circle.x, circle.y, circle.radius);

    // Collision detection
    if(collision) {
        circle.colour = "green";
        circle.xSpeed = 0;
        circle.ySpeed = 0;
        return circle;
    }else{
        circle.colour = "red";
        return circle;
    }
    })
  })
  /* if you want to examine the results, you can do so here
  [
    { colour: 'green', xSpeed: 0, ySpeed: 0 },
    { colour: 'green', xSpeed: 0, ySpeed: 0 },
    { colour: 'green', xSpeed: 0, ySpeed: 0 }
  ],
  [
    { colour: 'red'}
  ],
  */

  return results.any(result => result.colour === "green");
}

推荐阅读