当真实条件很少时,避免使用多个if语句



我想创建一个比较来自两个不同来源的变量的脚本。我需要比较一些值a1,a2。。。,an,具有一些其他值b1,b2。。。,bn。我想知道a1=b1,a2=b2。。。,an=bn。如果其中一些不相等,我想知道其中哪些不相等。这些变量是整数和字符串。所有对都有相同的可能性相等。

我也知道,这些变量不相等的情况极为罕见。事实上,在1000对变量中,几乎有1对变量可能是不相等的。我将运行脚本无数次,每次几乎有20个变量,所以大多数时候所有对都是相等的。我想知道我是否能以某种方式利用这一事实。

作为第一种方法,我想到了类似于多个if语句的东西。例如:

let equal = true;
let issues = [];
if (a1 !== b1){
equal = false;
issues.push("a1!=b1");
}
...
if (a20 !== b20){
equal = false;
issues.push("a20!=b20");
}

只要大多数时候不会有不平等的配对,我就想取消所有的a1,。。,将变量a转换为单个变量CCD_,。。。,bn转换为变量CCD_ 2。比较这两个变量,如果它们不相等,则执行上述过程。如果我的数据被清除了(没有null、undefined、"等(,这样做有意义吗?我不确定这是否会减少时间,我认为这可能是一种糟糕的做法。

let variableA = a1 + a2 + ... + a20;
let variableB = b1 + b2 + ... + b20;
let equal = true;
let issues = [];
if (variableA !== variableB){
equal = false;
if (a1 !== b1){
issues.push("a1!=b1");
}
...
if (a20 !== b20){
issues.push("a20!=b20");
}
}

或者:

if (!((a1===b1) && (a2===b2) && ... && (a20===b20))){ ...

我还考虑将变量存储在数组或对象中并进行比较。我认为,将它们存储在物体中可能会更好。我的脚本将用javascript编写,尽管我主要对这种方法而不是语言感兴趣。

不管它们的比较方式如何,在知道几乎所有时候我的条件都是假的情况下,有什么方法可以优化它吗?

知道几乎所有的条件都是false,有什么方法可以优化它吗?

如果是这种情况,运行时将注意到并相应地进行优化。你没有理由这么做。

此外,试图通过串联字符串来优化比较是一个非常糟糕的主意,因为串联比您试图优化的比较更昂贵。此外,比较字符串的成本与字符串的长度大致成正比,因此比较一个长字符串并不比比较多个短字符串快。重复比较(首先比较连接,然后比较单个字符串(当然比只看一次每个字符串慢。

尽管如此,除非该函数真的经常执行,否则这根本无关紧要:现代JavaScript运行时每秒可以比较大约10亿个字符。因此,通常情况下,您希望通过编写清晰易懂的代码来优化程序员时间,而不是运行时性能。

// place variables in 'a' group into ordered array
a_array = [a1, a2, a3, ..., an]
// place variables in 'b' group into ordered array
b_array = [b1, b2, b3, ..., bn]
// compare each item in array storing indexes of items which are not equal
not_equal_indexes = []
for (i = 0; i < a_array.length; i++) {
not_equal_indexes.push(i) ? a_array[i] != b_array[i] : ""
}
print(not_equal_indexes)

您必须使用一个在数组中接受多类型元素的运行时(即像PHP、Python或Javascript这样的弱类型语言(才能实现这一点。

否则,为每个组和每个组的元素可用的每个数据类型创建一个数组。for循环配置看起来应该是一样的,只是在记住元素的原始索引位置或其原始变量名方面稍作修改,而不管它在强类型数组组中的位置如何。