我正在使用一个函数来增加数组中的值,具体取决于传递给它的值。
function depth(x) {
var dep = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
if (x < 10) {
var deps = dep[0];
dep[0] = deps + 1;
} else if (x >= 10 && x < 20) {
var deps = dep[1];
dep[1] = deps + 1;
} else if (x >= 20 && x < 30) {
var deps = dep[2];
dep[2] = deps + 1;
} else if (x >= 30 && x < 40) {
var deps = dep[3];
dep[3] = deps + 1;
} else if (x >= 40 && x < 50) {
var dep2 = dep[4];
dep[4] = deps + 1;
} else if (x >= 50 && x < 60) {
var deps = dep[5];
dep[5] = deps + 1;
} else if (x >= 60 && x < 70) {
var deps = dep[6];
dep[6] = deps + 1;
} else if (x >= 70 && x < 80) {
var deps = dep[7];
dep[7] = deps + 1;
} else if (x >= 80 && x < 90) {
var deps = dep[8];
dep[8] = dep2 + 1;
} else if (x >= 90 && x < 100) {
var deps = dep[9];
dep[9] = dep2 + 1;
} else if (x >= 100 && x < 110) {
var deps = dep[10];
dep[10] = deps + 1;
} else if (x >= 110 && x < 120) {
var deps = dep[11];
dep[11] = deps + 1;
} else if (x >= 120 && x < 130) {
var deps = dep[12];
dep[12] = deps + 1;
} else if (x >= 130 && x < 140) {
var deps = dep[13];
dep[13] = deps + 1;
} else if (x >= 140 && x < 150) {
var dep2 = dep[14];
dep[14] = deps + 1;
} else if (x >= 150 && x < 160) {
var deps = dep[15];
dep[15] = deps + 1;
} else if (x >= 160 && x < 170) {
var deps = dep[16];
dep[16] = deps + 1;
} else if (x >= 170 && x < 180) {
var deps = dep[17];
dep[17] = deps + 1;
} else if (x >= 180 && x < 190) {
var deps = dep[18];
dep[18] = dep2 + 1;
} else if (x >= 190 && x < 200) {
var deps = dep[19];
dep[19] = dep2 + 1;
} else {
var dep2 = dep[10];
dep[20] = dep2 + 1;
}
}
我的问题是,是否有更简洁的方法来执行此操作,还是需要为每个可能的变量编写else if语句?
答案 0 :(得分:3)
除了你的其他陈述,这里有一个明确的模式。因此,最简单的方法是对此进行例外处理,然后将其余部分放在一起。
function depth(x) {
var dep = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
if (x >= 200) { // case for anything above 200
return dep[20] = dep[10] + 1;
}
dep[Math.floor(x/10)]++;
}
你的其他情况使它变得有点混乱,但总的来说,这是一种内线的东西。
答案 1 :(得分:2)
问题是你重复了很多,因为if/else
语句中的代码有很多相似之处。
当您在代码中找到相似之处时,以某种方式“合并”它们通常很有用。
例如,您可以注意到语句中的代码完全相同,但10, 20, 30
等值除外。然后,尝试确定制作这些10, 20, 30, 40
的方法,取决于您将用它们替换它们的唯一变量。
在这种情况下,很容易猜到,因为每次,你使用的数组键都等于你的数字除以10.借助JavaScript的内置对象Math
的某些方法,这是一些单行陈述的问题:
function depth(x) {
var dep = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
var nb = Math.floor(x / 10);
nb = Math.max(nb, 20);
dep[nb]++;
}
Math.max on Mozilla Developer Network
答案 2 :(得分:1)
试试这个:
var index = Math.floor(x/10);
var deps = dep[index];
dep[index] = deps + 1;
答案 3 :(得分:1)
这样的事情应该可以解决问题但由于你的dep是本地的而且从未返回过,所以函数什么都不做。
function depth(x) {
var dep = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
if(x < 200) {
var index = Math.floor(x/10);
dep[index]++;
} else {
dep[20] = dep[10] + 1;
}
}
无论如何,正如你可能猜到的那样,当你看到一个模式时,你可以把它简化为更简单的东西。
如果您的范围为10
,则表示您可以将数字除以10
以获取索引。您必须使用Math.floor
,因为1/2 => 0.5
并且它会尝试将值添加到索引“0.5”,这不存在。 Math.floor
会将数字截断为最低值。在我们的案例中,0,1,2,3,4...
。
没有全局规则,但是当你看到一个重复的模式时,你只需找到每个案例之间的共同点,你就能找到通过将值转换为某些东西来简化大多数情况的方法。对所有ifs
来说都是共同的。