需要一种优雅的方法来根据输入更改内联if语句的返回结果

时间:2014-07-02 02:43:43

标签: javascript arrays if-statement

为了更好地解释我想要做什么,我将在没有代码的情况下做一些前言,然后向您展示我正在处理相关部分的代码。

我目前正在使用一个测量画布元素宽度和高度的函数,并将每个大小的一半除以输入的数字。然后,我使用math.ceil()%2===0确定结果数字是否均匀。使用这个公式,我将决定宽度是布尔值true还是false,高度相同。

最后我会

var A = True(或False)

var B = True(或False)

然后我创建了一个三维数组:

var pax = [];

for (var i = 0; i < stage.height()/12; i++){
    pax[i] = [];
    for (var j = 0; j < stage.width()/12; j++){
        pax[i][j] = [];
        pax[i][j].push("if statement here");
    };
}

我需要一种优雅的方法来替换“if statement here”,例如double if语句

if (A === B) { 
    (((i%2)===0)===((j%2)===0)) ? 0 : 180) 
    || 
    (((i%2)===0)!==((j%2)===0)) ? 180 : 0) 
} else { 
    (((i%2)===0)===((j%2)===0)) ? 180 : 0) 
    || 
    (((i%2)===0)!==((j%2)===0)) ? 0 : 180) 
};

我很确定我刚输入的这些怪物不会起作用,所以我需要两种正确的方法来输入语法,并且需要更优雅和资源轻量级的方法,这只是因为我将推送的索引位置数量在阵列中。

基本上我试图做的是“根据画布的高度和宽度,如果i是偶数,则返回0,如果i是奇数,则返回180,或者基于画布的高度和宽度,如果i为偶数,则返回180,如果i为奇数,则返回0.

如果不清楚,我可以尝试再解释一下。

3 个答案:

答案 0 :(得分:4)

您希望模数运算匹配或不匹配。使用x % 2时,只能有两个结果中的一个,因此转换为带有===的布尔值毫无意义。而且这些事情只是过分的。所有这些混乱都无济于事。所以这是第一遍:

if (A === B) { 
    (i%2===j%2 ? 0 : 180) || (i%2!==j%2 ? 180 : 0) 
} else { 
    (i%2===j%2 ? 180 : 0) || (i%2!==j%2 ? 0 : 180) 
}

然后,您似乎希望根据与A === B的比较来翻转数字。因此,如果他们是平等的,甚至你想要0, 180,或者他们是不平等和奇怪的,你需要180, 0。所以基本上如果i/j比较和A/B比较是相同的,你有一个结果,否则,另一个。

奇怪的是,当一个%测试成功但产生0时,||操作会使它尝试相反的%测试,这当然会失败。但由于第二次测试的数字是相反的,我们最终会得到正确的值。只是你正以迂回的方式去做它。


最终,您的代码所做的只是:

(A === B) === (i%2===j%2) ? 0 : 180

这是一个演示,显示您的原始版本和简短版本可以获得相同的结果。

DEMO: http://jsfiddle.net/jDWf6/3/

(编辑:更新了演示以显示所有测试值。)

答案 1 :(得分:1)

条件:

if (A === B) { 
    (((i%2)===0)===((j%2)===0)) ? 0 : 180) 
    || 
    (((i%2)===0)!==((j%2)===0)) ? 180 : 0) 
} else { 
    (((i%2)===0)===((j%2)===0)) ? 180 : 0) 
    || 
    (((i%2)===0)!==((j%2)===0)) ? 0 : 180) 
};

(阻止声明后不需要分号)

过于复杂,可以简化为(假设它应该返回一些东西):

var result;

if (A === B) { 
  result = i%2 == j%2? 0 : 180 || i%2 != j%2? 180 : 0; 
} else { 
  result = i%2 == j%2? 180 : 0 || i%2 != j%2? 0 : 180;
}

在第一个赋值中,两个||操作数为i和j的任何给定值返回相同的值,因此它可能也是:

  result = i%2 == j%2? 0 : 180;

因为如果i%2 == j%2返回true,则:

i%2 == j%2? 0 : 180

返回0,转换为false,因此评估第二个表达式:

i%2 != j%2? 180 : 0

i%2 != j%2必须返回false(因为相反的情况属实)并且再次返回0。如果原始表达式返回false,则完全相反:

i%2 == j%2? 0 : 180

返回180,这是真实的,因此||的{​​otehr'侧未被评估。

所以现在你有:

if (A === B) { 
  result = i%2 == j%2? 0 : 180; 
} else { 
  result = i%2 == j%2? 180 : 0;
}

这意味着结果:

i%2 == j%2? 0 : 180

基于A === B反转,因此:

result = A === B? (i%2 == j%2? 0 : 180) : (i%2 == j%2? 180 : 0)

当然,如果您的伪代码没有按照您的意愿行事,这可能会有所帮助......

答案 2 :(得分:1)

好的,我的朋友根据你在这里问的是答案。

*我不知道这是否会是你要找的东西,因为你的逻辑有点复杂而且不太正确....

正如您所看到的,我减少了代码,并最大限度地提高了性能。我也清楚说明“我”和“j”是什么。只是为了更具可读性......

var pax = [];
var isHeightEven, isWidthEven;

for (var height = 0; height < stage.height() / 12; height++) {
    pax[height] = [];
    for (var width = 0; width < stage.width() / 12; width++){
        pax[height][width] = [];
        isHeightEven = !(height % 2); //calculate only once
        isWidthEven = !(width % 2); //calculate only once

        pax[height][width].push(
            (A === B) ? ((isHeightEven && isWidthEven) ? 0 : 180) : ((isHeightEven && isWidthEven) ? 180 : 0)
            );
    };
}