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

avoid multiple if-statements when true conditions are rare

我想创建一个脚本来比较来自两个不同来源的变量。 我需要将一些值 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,..,an 变量转换为单个变量 variableA 和所有 b1,...,bn到变量 variableB。比较两个变量,只有当它们不相等时,才执行上述过程。如果我的数据被清理(没有 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 编写,尽管我最感兴趣的是方法而不是语言。

无论以何种方式比较它们,知道几乎所有时候我的条件都是假的,是否有任何优化方法?

// 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 循环配置看起来应该是一样的,只是在记住元素的原始索引位置或其原始变量名时稍作修改,而不管它在强类型数组组中的位置。

is there any way to optimize it knowing that almost all the times my conditions will be false?

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

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

综上所述,除非该函数真的经常执行,否则它甚至都没有关系:现代 JavaScript 运行时每秒可以比较大约十亿个字符。因此,通常您会希望通过编写清晰易懂的代码来针对程序员时间而不是运行时性能进行优化。