迭代数组到数组,没有重复项
Iterating array over array without duplicates
我正在编写一个带有简单碰撞检测系统的简单游戏。
我目前有这段代码,用于在同一个数组上迭代数组,这样我就可以检查对象是否彼此靠近,以及它们是否会碰撞:
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:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/SetSet对象允许您存储任何类型的唯一值,无论是原始值还是对象引用。
[...new Set(objects)]
相关文章:
- 使用嵌入式数组迭代JSON
- 节点.js异步数组迭代
- jQuery 数组迭代
- Javascript:(ES5)数组迭代的权威指南
- Javascript 数组迭代
- JavaScript 数组迭代方向
- 是否可以在 ES6 Set 实例上使用数组迭代方法
- Javascript 中的数组迭代问题
- javascript 2D数组迭代返回未定义的函数参数
- 返回数组迭代
- 这对于数组元素上的简单数组迭代操作来说是最有效的
- 数组迭代陷阱
- JavaScript数组-迭代问题
- JavaScript For循环数组迭代问题-使用一个循环与两个循环
- 如何克服javascript数组迭代跳过记录/秒
- 将数组迭代到自定义网格中
- 在Node.JS中跨数组迭代save
- 数据可见性的数组迭代- javascript
- 在数组迭代中迭代对象键
- 使用数组迭代对象属性