迭代数组到数组,没有重复项

Iterating array over array without duplicates

本文关键字:数组 迭代      更新时间:2023-09-26

我正在编写一个带有简单碰撞检测系统的简单游戏。

我目前有这段代码,用于在同一个数组上迭代数组,这样我就可以检查对象是否彼此靠近,以及它们是否会碰撞:

var objects = []; //assume this is not empty
for(i=0;i<objects.length;i++){
  for(a=0;a<objects.length;a++){
    if(a != i){
      //collision handling
    }
  }
}

但是这个代码的主要问题是我有重复的。例如,我检查I和a,但稍后我检查a和I具有相同的值。

我尝试使用一个数组来保存哪些对象与哪些对象进行检查,但它给了我一个大的fps下降。

最好的方法是什么?

在第一个for循环的当前位置开始第二个for循环:

for(i=0;i<objects.length;i++){
    for(a=i+1;a<objects.length;a++){
      //collision handling
    }
}

这样你就只检查数组中的每一项与当前项之前的项。

让我们检查你的原始代码:

objects = ['a', 'b', 'c']
for(i=0;i<objects.length;i++){
  for(a=0;a<objects.length;a++){
    if(a != i){
      console.log("Checking "+ objects[i]+ "vs. "+objects[a]);
    }
  }
}

现在,让我们来看看我的例子:

objects = ['a', 'b', 'c']
for(i=0;i<objects.length;i++){
  for(a=i+1;a<objects.length;a++){
    console.log("Checking "+ objects[i]+ "vs. "+objects[a]);
  }
}

一般的思想是只将每一项与数组中紧跟其后的项进行比较:

[a, b, c, d]
 a => vs b, c, d    ar[0] vs ar[1], ar[2], ar[3]
    b => vs c, d    ar[1] vs        ar[2], ar[3]
       c => vs d    ar[2] vs               ar[3]

如果可以使用ES2015,则Set只允许集合中唯一的成员。来自MDN:

Set对象允许您存储任何类型的唯一值,无论是原始值还是对象引用。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set

[...new Set(objects)]