需要一种优雅的方式来根据输入改变一行if语句的返回结果

Need an elegant way to change the return results of a in line if statement based on inputs

本文关键字:输入 一行 改变 语句 结果 返回 if 方式 一种      更新时间:2023-09-26

为了更好地解释我要做的事情,我将不写代码,然后向您展示我在相关部分中使用的代码。

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