【问题标题】:Where to use additional condition when using Array methods使用数组方法时在哪里使用附加条件
【发布时间】:2023-06-17 05:05:01
【问题描述】:

我试图解决以下问题:

编写一个函数,如果所有数组元素都为真,则返回真。使用减少

这是我编的解决方案

function allTrue(values) {
  if ( values[0] === false) return false
  if (values.length === 0) return true
  let result = values.reduce( (final, value) => final = value === true, true) 
  return result ? true : false
}

我的问题是,是否可以将外部条件移动到 reduce 方法的主体中。

也就是说,如果需要我用一个reduce方法来解决,我可以实现吗?

我尝试在 reduce 中操作 final,但稍后在下一次迭代中对其进行了修改

例如下面的测试应该返回 false 但返回 true

allTrue([false, true])

任何解释将不胜感激,谢谢

【问题讨论】:

  • reduce 必须吗?如果不是,为什么不能使用every 让生活更轻松的方法:)
  • @Codenewbie 这可能是一个功课,所以是的,即使every 更好,他们仍然应该使用reduce,只是为了学习如何使用它。

标签: javascript arrays reduce


【解决方案1】:

您的代码不起作用的原因是reduce 仅返回数组中的last 元素与true 的比较结果。由于[false, true] 中的最后一个元素是true,所以它返回true

请注意,您的代码过于复杂,您已经有效地将条件包含在reduce 中(初始值为true 意味着零长度数组将返回true)。您的一个问题是 reduce 中的代码不正确,您应该检查 all 以前的值是否是 true 以及当前值是否是当前值以及所有以前的值:

const allTrue = (values) => values.reduce((curr, value) => curr && value, true);

console.log(allTrue([]));
console.log(allTrue([true]));
console.log(allTrue([false]));
console.log(allTrue([true, true, true]));
console.log(allTrue([false, true]));

【讨论】:

  • 空数组的好处理?
  • @Nick 我得到了代码,但我很难像你的那样简单地编写它们。流程图对此有帮助吗?谢谢
  • @Nader.Bhr 很多真正归结为经验和以前解决过类似问题。
  • @GerardoFurtado 是的,但是我不会将我的变量命名为 valuescurrvalue... :-)
  • @Nader.Bhr 一般来说,没有。 SO 用于解决代码问题。此类问题通常更适合codereview.stackexchange.com,但请务必阅读那里的导览,以确保您的问题在发布之前是合适的。
【解决方案2】:

我认为这会有所帮助:

function allTrue(values) {
  return values.reduce((final, value) => final && value)
}

【讨论】:

    【解决方案3】:

    我们也可以使用every 来找到解决方案。下面是everyreduce 的sn-p

    var allTrue_Every = (arr) => arr.every(d => d == true)
    
    console.log(allTrue_Every([true, true]))
    console.log(allTrue_Every([true, false]))
    
    var allTrue_Reduce = (arr) => arr.reduce((r, d) => r && d, true)
    
    
    console.log(allTrue_Reduce([true, true]))
    console.log(allTrue_Reduce([true, false]))

    【讨论】: