"or" javascript 中布尔值列表的最短路径

Shortest way to "or" a list of booleans in javascript

我有一个布尔值列表。我想对它们中的每一个应用 || ("or"),并得到结果。 (所以,一个新的布尔值。)

列表没有固定长度,所以不能简单的把代码写成value = l[0] || ... l[length-1]。 (对于长列表来说也很丑陋。)

我的做法:

let index = 0;
let value = true;
while(index < list.length && value == value || list[index]) {
    index += 1;
}

我想这可以作为一个声明。怎么样?

一种选择是使用 .some:

const value = list.some(Boolean);

const list = [false, false, false, true, false];
const value = list.some(Boolean);
console.log(value);

const list = [false, false, false, false, false];
const value = list.some(Boolean);
console.log(value);

在一般情况下,正是 Array.prototype.reduce 的用途:

list.reduce((previousValue, currentValue) => previousValue || currentValue)

reduce (or fold as it is called in some other languages) 是一种通用迭代方法,这意味着任何你可以用循环做的事情,你也可以用 reduce 做。 reduce 的作用是使用二元运算将集合的所有元素 "fold" 转换为新值。在这种情况下,这是一个相当简单的操作,结果类型与元素类型相同,但情况并非必须如此:结果类型可以与元素类型不同,并且结果类型可以任意复杂(它甚至可以再次是一个集合)。

您可以将 reduce 视为用二元运算符替换数组中的逗号。换句话说,如果你有

const arr = [a, b, c, d, e, f, g];

然后

arr.reduce((accumulator, element) => accumulator + element)

将计算

a + b + c + d + e + f + g

但是,因为 reduce 是一个 通用的 方法,所以它没有表达太多意义。有更多专门的方法无法做到 "everything",但使用这些方法可以告诉 reader 更多关于您的代码中正在发生的事情。因此,例如,您 可以 使用 reduce 来转换每个元素,但是您 应该 而使用 Array.prototype.map .

请注意,您的具体示例具有一些特定的属性:因为 OR-ing 一堆值在一起只是 false 如果每个值都是 false,或者换句话说, is true 如果至少有一个值是 true, 我们需要检查的是是否有 some 元素是 true.

还有一种检查某个元素是否具有特定属性的特定方法:Array.prototype.some:

list.some(el => el)

在这种情况下,属性实际上只是身份函数。或者,您可以使用 Boolean constructor,它充当布尔值的身份函数:

list.some(Boolean)

您还可以使用 Array.prototype.includes 检查列表是否包含至少一个 true 值:

list.includes(true)

您可以使用 .includes,它检查数组是否包含值,以及 returns true / false

const list = [true, true, true, true, false];

// Checks if list contains the Boolean True
const value = list.includes(true);

console.log(value);

这是 reduce 的经典用例:

value = list.reduce((a, b) => a || b, false);

(请注意,起始累加器值应为 false - 按原样使用 true,结果将 始终true! )