【发布时间】:2015-01-14 20:14:27
【问题描述】:
我正在尝试优化我的代码,使其更高效、更易于阅读。我有一些组合的 if 语句,我认为这可能会更好,如果将它们转换为 for 循环,我只是不确定该怎么做?
这是我的代码:
if (starportSelected){
if(game.currentLevel.requirements.vehicles.indexOf('transport')>-1 && cashBalance>=vehicles.list["transport"].cost){
$("#transportbutton").removeAttr("disabled");
}
if(game.currentLevel.requirements.vehicles.indexOf('scout-tank')>-1 && cashBalance>=vehicles.list["scout-tank"].cost){
$("#scouttankbutton").removeAttr("disabled");
}
if(game.currentLevel.requirements.vehicles.indexOf('heavy-tank')>-1 &&cashBalance>=vehicles.list["heavy-tank"].cost){
$("#heavytankbutton").removeAttr("disabled");
}
if(game.currentLevel.requirements.vehicles.indexOf('harvester')>-1 && cashBalance>=vehicles.list["harvester"].cost){
$("#harvesterbutton").removeAttr("disabled");
}
if(game.currentLevel.requirements.aircraft.indexOf('chopper')>-1 && cashBalance>=aircraft.list["chopper"].cost){
$("#chopperbutton").removeAttr("disabled");
}
if(game.currentLevel.requirements.aircraft.indexOf('wraith')>-1 && cashBalance>=aircraft.list["wraith"].cost){
$("#wraithbutton").removeAttr("disabled");
}
}
我认为第一步是创建两个数组,一个用于车辆,一个用于飞机,如下所示:
var vehicles = ['transport', 'scout.tank', 'heavy-tank', 'harvester'];
var aircraft = ['chopper', 'wraith'];
但是如何获取其余代码并将其更改为 for-loop 对我来说似乎是一个难题。 所有帮助和解释将不胜感激!
【问题讨论】:
-
如果你有两个数组,你将不得不遍历它们。看起来你的代码需要一个用于车辆的嵌套 for 循环,以及用于飞机的嵌套循环。这是 O(n^2) 这不是很好。索引哈希表中的特定位置(我假设您有哈希表每次查找将花费 O(1),如果您有 n 个元素并遍历所有元素,总共可以花费 O(n)解释你的代码试图做什么?
-
这里为什么需要 2 个特定的数组?为什么不合并成一个对象?
-
如果您关心性能,您应该为重复的对象访问设置别名。
var foo = game.currentLevel.requirements.vehicles;然后foo.indexOf('blah') -
在游戏中我有一个名为 startport 的对象。当玩家选择星港时,只要玩家有足够的资金,就可以在侧边栏菜单中选择车辆或飞机。代码现在可以正常工作,但我相信使用某种循环可能会更好,我只是不确定如何编写它?
-
@Sushanth--
game.currentLevel.requirements.aircraft.indexOf和game.currentLevel.requirements.vehicles.indexOf是不同的行。
标签: javascript jquery arrays if-statement for-loop