为了更好地解释我想要做什么,我将在没有代码的情况下做一些前言,然后向您展示我正在处理相关部分的代码。
我目前正在使用一个测量画布元素宽度和高度的函数,并将每个大小的一半除以输入的数字。然后,我使用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.
如果不清楚,我可以尝试再解释一下。
答案 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)
);
};
}