需要一种优雅的方式来根据输入改变一行if语句的返回结果
Need an elegant way to change the return results of a in line if statement based on inputs
为了更好地解释我要做的事情,我将不写代码,然后向您展示我在相关部分中使用的代码。
I目前正在使用一个函数,该函数测量画布元素的宽度和高度,并将每个尺寸的一半除以输入的数字。然后,我通过使用math.ceil()
和%2===0
来确定结果数是否为偶数。使用这个公式,我将决定宽度是布尔值为真还是假,高度也是如此。
最后我将有
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语句",比如双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。
如果不清楚的话,我可以再解释一遍。
您希望模数操作匹配或不匹配。对于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
这是一个演示,显示你的原始版本和简短版本达到相同的结果。
演示: http://jsfiddle.net/jDWf6/3/
(编辑:更新的演示以显示所有测试值)
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(因为相反是true),并且再次返回0。如果原始表达式返回false,则完全相反:
i%2 == j%2? 0 : 180
返回180,这是真值,因此不计算||
的另一边。
那么现在你有:
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)
当然,如果你的伪代码没有做你希望的事情,这可能是错误的…
好吧,我的朋友,根据你的问题,这里是答案。
*我不知道这是不是你想要的,因为你的逻辑有点复杂,不太正确....
正如您所看到的那样,它减少了代码并最大化了性能。我也明确了什么是"i"和什么是"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)
);
};
}
- 如何要求用户输入一个介于 1 和 50 之间的整数,然后小程序打印出一行这个星数
- 无法破解pass-css插件以使两个输入元素出现在一行中
- 在同一行中对齐选择、输入、提交而不向下
- Javascript 在单击时将输入值更改为单击按钮的同一行上的值
- 如何获取新表行仅当先前输入的一行不为空时才单击
- Jquery.on(change)事件on<选择>输入仅更改第一行
- 激活输入的复选框有效,但如果一行输入重复,它的行为会很奇怪
- 如何为一行文本输入字段添加用户可编辑的文本标签
- 使用JavaScript插入一行新的输入标记
- 我如何在点击按钮时使一行ng重复中的输入只读
- 如何按顺序给出数字即使我删除了一行输入,顺序也不应该重复
- Javascript关注前一行's的第一个输入
- 根据具有用户输入的另一行的值在表中插入一行
- 我如何触发模糊和运行通过所有输入在一行
- 将文本添加到每个单选输入的同一行
- 在使用可能的计时器检测到输入后自动移动到下一行
- Jquery移动到下一行's输入元素的id
- 单击表中同一行中的锚标记时,选择同一行中的输入标记
- 我的正则表达式只需一行输入即可正常工作,但不要't有两个或两个以上.
- 如何在Angular中使用ng-click函数设置最后一行输入的焦点