更紧凑的方式来做到这一点?

时间:2009-05-17 11:46:54

标签: javascript arrays loops

我有几个循环细胞周围细胞的功能。网格包含在数组中。

在我的代码中,我检查以确保它不是边缘单元格之一,因为检查未定义的单元格会导致错误。

因此,我有这样的代码:

if(x > 0) {
    var firstX = x - 1;
} else {
    var firstX = x;
}
if(x < 199) {
    var lastX = x + 1;
} else {
    var lastX = x;
}

if(y > 0) {
    var firstY = y - 1;
} else {
    var firstY = y;
}
if(y < 199) {
    var lastY = y + 1;
} else {
    var lastY = y;
}

很多代码行做得很少。有更优雅的方式吗?

4 个答案:

答案 0 :(得分:11)

或者更清楚:

var firstX = Math.max(x - 1, 0);
var lastX = Math.min(x + 1, 199);
var firstY = Math.max(y - 1, 0);
var lastY = Math.min(y + 1, 199);

答案 1 :(得分:9)

您可以使用条件运算符:

var firstX = x > 0 ? x - 1 : x;
var lastX = x < 199 ? x + 1 : x;
var firstY = y > 0 ? y - 1 : y;
var lastY = y < 199 ? y + 1 : y;

可以删除冗余,方法是编写一个函数来计算给定值的“first”,以及类似的“last” - 但我认为在这种情况下会有点过分。

答案 2 :(得分:4)

您可以使用条件运算符:

var firstX = x - (x > 0 ? 1:0);
var lastX = x + (x < 199 ? 1:0);
var firstY = y - (y > 0 ? 1:0);
var lastY = y + (y < 199 ? 1:0);

编辑:
提供了另一种使用它的方式,因为Jon已经发布了“我的”代码。 ;)

编辑2:
正如Rafael指出的那样,条件可以隐式转换为数字,因此不需要条件运算符:

var firstX = x - (x > 0);
var lastX = x + (x < 199);
var firstY = y - (y > 0);
var lastY = y + (y < 199);

然而,这段代码实际上做的不太明显。从我的测试来看,似乎Javascript始终使用值1表示true,但是在编程语言中,值-1与常用的一样。

答案 3 :(得分:0)

使用您检查的变量(x和y)而不是First / lastX和First / lastY

if(x > 0 && x < 199) x-=1;
else if(x > 0) x+=1;

if(y > 0 && y < 199) y-=1;
else if(y > 0) y +=1;

在此之后检查x和y。 :)