- 让 table = [0, 0, 0, 0]
该数组的元素用于跟踪 4 种情况:
table[0] - 当某个事件没有发生(例如没有披萨)并且结果为假(例如松鼠变形为假)时
table[1] - 当某个事件发生时(例如披萨)但结果为假(例如松鼠变形为假)
table[2] - 当某个事件没有发生(例如没有披萨)但结果为真(例如松鼠变形为真)时
table[3] - 当某个事件发生(例如披萨)并且结果为真(例如松鼠变形为真)时
-
让 entry = journal[i], index = 0
journal[i] 基本上在通过journal 的第i 次迭代中选择对象(journal 是一个对象数组),在for (let i = 0; i 并将其存储在变量 entry 中。
index = 0也是一个默认值为0的变量,用于设置table = [0, 0, 0, 0]的默认索引 (你很快就会看到)
-
当 console.log(tableFor("pizza", JOURNAL)) 运行时,for 循环在第一次迭代 (i=0) 上。它转到日志 [0],并设置条目 = 日志 [0]。
它运行 if (entry.events.includes(event)) 即如果 events
(它是 journal[0] 的对象中的一个项目 - 现在由条目引用)包含/包含事件,例如比萨。如果是,它会将索引增加 1 (index += 1)
然后转到下一行 if (entry.squirrel) 和
进行检查,即是否在日志 [0] 的对象中的第二个项目
发生例如如果松鼠是真的。如果是,它将索引增加 2
(索引 += 2)。
A. 为简单起见,我们假设只有第一个条件为真,即它只运行 index += 1 因为当它运行 (entry .events.includes(event)),它找到了披萨事件,但是当它运行时 (entry.squirrel) index += 2; squirrel 为假,因此 index +=2 将是忽略。此时,table[index] = table[1] BECAUSE index = 0 在 index += 1 处增加了 1其他条件被发现是错误的。然后运行 table[1] += 1 并且 table 变为 [0, 1, 0, 0]。 (请记住,您可以通过这种方式更改数组的元素(选择数组中的索引并使用 = 运算符将其设置为新值))
如果检查了第一个条件并且没有找到比萨饼事件以及 squirrel=false,则 index = 0 仍然存在,因此 table[index] = table[0]。然后运行table[0] += 1,table变为[1, 0, 0, 0]
B. 假设 ONLY if (entry.squirrel) index += 2; 为真,而上一行 if (entry.events.includes(event)) index += 1; 使得 index = 0 保持不变,index 从 0 增加到 2 因为 index += 2。此时表[索引] = 表[2]。当 table[2] += 1 运行并且表变为 [0, 0, 1, 0] 因为表转到索引 2 并将其设置为 1。
C.在两个if条件为真的情况下,index=0在if(entry.events.includes(event )) index += 1;,并在 if (entry.squirrel) index += 2; 处进一步增加 2。即 index = 0 +1 +2 = 3。此时,index = 3 并且 table[index] = table[3]。因此,table[3] += 1 将 table 更新为 table[0, 0, 0, 1]
循环 (for (let i = 0; i ) 从 journal[0] 一直持续到 journal[length - 1],从索引到索引更新table = [0,0,0,0],由于table[,每次增加每个表索引处的项目index] += 1,随着条件的检查,直到检查了日志数组中的最后一个对象并且表完成了更新。
希望对你有所帮助