如何在if语句中停止循环

时间:2018-08-14 03:06:56

标签: javascript

var enemies = [
	{
		nick: "Bob1",
		x: 12,
		y: 21
	},
	{
		nick: "Bob2",
		x: 20,
		y: 21
	},
	{
		nick: "Bob3",
		x: 12,
		y: 21
	}
]
var me = {
	x: 19,
	y: 20
}

for (var x in enemies) {
   var enemy = enemies[x];
   if ((Math.abs(me.x - enemy.x) <= 1 && Math.abs(me.y - enemy.y) <= 1)) { 
      console.log("Enemy In range");
   } else {
      console.log("Enemies not in range");
   }
}

大家好。我有一系列敌人,我正在检查是否有一些敌人与我的x或y位置相距1场。而且我只想登录一次,无论是否登录。如您现在所见,它检查每个敌人,并记录每个敌人。这不是我想要的。我只想简单地检查一下我的x或y位置是否有敌方1区域,并得到简单的回答“是”或“否”。我完全是新手,但是如果您对我有任何提示,那就太好了!

5 个答案:

答案 0 :(得分:4)

具有一个以found开头的布尔值,例如false。找到它后,将其设置为truebreak。然后循环后包含if (found) ... else ...。这样会将打印移出循环,确保仅获得一次。

此外,您可以使用新的some方法对其进行大量压缩,该方法在内部基本执行相同的操作(速度更快):

let found = enemies.some(enemy => enemyIsClose(enemy, me));

如果您实际上需要查找哪个敌人在附近,则find而不是some将返回第一个敌人,而filter将返回所有敌人。

答案 1 :(得分:2)

如果找到匹配的元素,则可以使用Array#find来从循环中尽早返回。

var enemies = [{
    nick: "Bob1",
    x: 12,
    y: 21
  },
  {
    nick: "Bob2",
    x: 20,
    y: 21
  },
  {
    nick: "Bob3",
    x: 12,
    y: 21
  }
]

var me = {
  x: 19,
  y: 20
}

var enemy = enemies.find(enemy => (Math.abs(me.x - enemy.x) <= 1 && Math.abs(me.y - enemy.y) <= 1));

if (typeof enemy !== undefined) {
  console.log("Enemy In range");
} else {
  console.log("Enemies not in range");
}

答案 2 :(得分:1)

为了让您的代码检查附近是否有敌人,它需要遍历敌人的所有位置,无法绕开它,但是如果您只想减少控制台日志的数量,则可以使用以下代码:

var isEnemyFound = true;
for (let x of enemies) {
   var enemy = enemies[x];
   if ((Math.abs(me.x - enemy.x) <= 1 && Math.abs(me.y - enemy.y) <= 1)) { 
      console.log("Enemy In range");
      break;
   } else {
      isEnemyFound = false;
   }
}

if(!isEnemyFound){
console.log("Enemies not in range");
}

答案 3 :(得分:1)

您可以简单地使用Array.filter过滤对象并找到您的集合。

var enemies = [
	{
		nick: "Bob1",
		x: 12,
		y: 21
	},
	{
		nick: "Bob2",
		x: 20,
		y: 21
	},
	{
		nick: "Bob3",
		x: 12,
		y: 21
	}
]
var me = {
	x: 19,
	y: 20
}
var enemy=enemies.filter(item=>{
  return me.x-item.x<=1
})[0];
console.log(enemy);

答案 4 :(得分:1)

总体来说,这是一个更好的灵魂。前一个是我在飞行中做的。 尝试使用它,看看这是否是您需要的。我真的希望是:)

如果将( me - values )更改为'13',结果仍然相同,但是请尝试将其更改为'14',并查看逻辑如何发挥作用。这是一个过大的杀伤力,但是如果您想提高自己的游戏水平,那就是一个很好的解决方案,因为您可以随时创建任意数量的变体和可能性,只需调用next();即可创建下一个值。只是一个建议。祝你好运!

let enemies = [
	{nick: "Bob1", x: 12, y: 21},
	{nick: "Bob2", x: 12, y: 21},
	{nick: "Bob3", x: 12, y: 21}
  ];

let me = {
	x: 12,
	y: 21
}

function* range() {

for (let x in enemies) {
   let enemy = enemies[x];

while(Math.abs(me.x - enemy.x) <=1 && Math.abs(me.y - enemy.y) <= 1) {
    yield "Enemy is in range";
    break; // closes iterator, triggers return
  }  
    yield "Enemy is NOT in range";
    break;
  }
}

var gen = range(); // Creating a generator

console.log(gen.next().value); // Then we use it to get the next value