在数组上迭代数组而不重复
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:
The Set object lets you store unique values of any type, whether primitive values or object references.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set
[...new Set(objects)]
我正在编写一个带有简单碰撞检测系统的简单游戏。
我目前有这段代码用于在同一个数组上迭代数组,这样我就可以检查对象是否彼此靠近以及它们是否会发生碰撞:
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:
The Set object lets you store unique values of any type, whether primitive values or object references.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set
[...new Set(objects)]