【问题标题】:More compact way to do this?更紧凑的方式来做到这一点?
【发布时间】:2010-10-26 20:13:26
【问题描述】:

我有几个函数可以围绕单元格的周围单元格循环。网格包含在一个数组中。

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

因此,我有这样的代码:

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;
}

很多行代码要做的很少。有没有更优雅的方法来做到这一点?

【问题讨论】:

    标签: javascript arrays loops


    【解决方案1】:

    可以使用条件运算符:

    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;
    

    可以通过编写一个函数来计算给定值的“第一个”以及“最后一个”的类似函数来消除冗余 - 但我认为在这种情况下这将是矫枉过正。

    【讨论】:

    • 谢谢。我知道我忽略了一些简单的事情。
    【解决方案2】:

    可以使用条件运算符:

    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 一样常用。

    【讨论】:

    • 不需要三元运算符。你可以写 var firstX = x - (x > 0) JS会自动将布尔值转换为数字
    • @Rafael:我想说这比使用条件的可读性差。
    • @Jon Skeet:是的,它的可读性较差,但它更紧​​凑,而且我们使用了 javascript 语言的特性。逻辑 true 被转换为 1(数值), false 被转换为 0。
    【解决方案3】:

    或者更清楚:

    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);
    

    【讨论】:

    • 假设 x 和 y 在 [0, 199] 范围内。情况可能是这样,但这是一个假设。 (考虑 x = -10:原始代码将使 firstX= -9,你的将给出 0。)除此之外,我喜欢它。
    • 如果 x 或 y 199,则代码中的其他地方出了问题,因为在正常情况下,x 和 y 应该在 0 到 199 之间。
    【解决方案4】:

    使用您检查的变量(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。 :)

    【讨论】:

      猜你喜欢
      • 2021-12-20
      • 1970-01-01
      • 1970-01-01
      • 2010-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多