【问题标题】:Check if all array values are the same with reduce()检查所有数组值是否与 reduce() 相同
【发布时间】:2017-01-10 10:02:50
【问题描述】:

我需要比较 ONE 数组中的所有值 以了解它们是否都相等。 所以这很好,给了我预期的输出

var myArray1 = [50, 50, 50, 50, 50];  // all values are same, should return true
var myArray2 = [50, 50, 50, 50, 51];  // last value differs, should return false

function compare(array) {
    var isSame = true;
    for(var i=0; i < array.length; i++) {
       isSame = array[0] === array[i] ? true : false;
    }
    return isSame;
}

console.log('compare 1:', compare(myArray1)); // true 
console.log('compare 2:', compare(myArray2)); // false

然后我对reduce() 进行了同样的尝试,但看起来我误解了该功能。他们都说这是假的。我在做一些明显错误的事情吗?我可以使用reduce() 来获得我需要的东西吗?如果有怎么办?

var myArray1 = [50, 50, 50, 50, 50];
var myArray2 = [50, 50, 50, 50, 51];

console.log('reduce 1:', myArray1.reduce(
  function(a, b){
    return a === b ? true : false
  }
));

console.log('reduce 2:', myArray2.reduce(
  function(a, b){
    return a === b ? true : false
  }
));

【问题讨论】:

  • 你是只看reduce,还是像filter这样的函数?
  • 这不是reduce()方法的实际用例
  • 人们似乎将此解释为检查myArray1myArray2 是否包含相同的值。 (我不知道怎么做,但到目前为止有两个人。)可能值得强调你想做的事情。
  • @T.J.Crowder 谢谢你,会更新以更清楚

标签: javascript arrays


【解决方案1】:

reduce 在这里不是正确的工具,您从一次迭代返回的值在下一次迭代中用作areduce 不会短路。

如果您想使用其中一种数组方法来执行此操作,every 将是一个合理的选择:

var myArray1 = [50, 50, 50, 50, 50];
var myArray2 = [50, 50, 50, 50, 51];

console.log('some 1:', myArray1.every(
  function(value, _, array){
    return array[0] === value;
  }
));

console.log('some 2:', myArray2.every(
  function(value, _, array){
    return array[0] === value;
  }
));

every 短路,知道结果后立即停止。

我的意思是,你可以把它塞进reduce,但这不合适。我们用true 初始化标志,然后传播&amp;&amp;'ing 的结果,并检查该条目与数组的第一个条目:

var myArray1 = [50, 50, 50, 50, 50];
var myArray2 = [50, 50, 50, 50, 51];

console.log('some 1:', myArray1.reduce(
  function(flag, value){
    return flag && myArray1[0] === value;
  },
  true
));

console.log('some 2:', myArray2.reduce(
  function(flag, value){
    return flag && myArray2[0] === value;
  },
  true
));

【讨论】:

  • 谢谢 T.J.像往常一样,你的解释很棒!
  • @MichałPerłakowski:这取决于你想从一个空数组得到什么结果。 every 总是为空数组返回 true。这是对还是错取决于用例。
【解决方案2】:

正常的方法是使用.every() 函子。如果坚持我会想出一个.reduce() 解决方案如下;

var arr = [50,50,50,50,50],
    brr = [50,50,51,50,50],
    res = arr.reduce((p,c) => p === c ? p : false);
console.log(res);
res = brr.reduce((p,c) => p === c ? p : false);
console.log(res);

如果有害群之马,它将返回数组填充的元素或false。如果您的输入数组中满是falses,上述代码将失败。

【讨论】:

    【解决方案3】:

    尝试(如果它们是数字)这种方式

    var myArray1 = [50, 50, 50, 50, 50];
    var myArray2 = [50, 50, 50, 50, 51];
    
    var same = myArray1 >= myArray2 && myArray1 <= myArray2;
    

    【讨论】:

    • 我看到了三个可能的原因: 1. 问题是关于检查单个数组中的所有值是否相同。以上是将myArray1myArray2 进行比较。 2. 通过将数组转换为字符串然后进行字典比较来比较数组不是一个好主意。 3.a &gt;= b &amp;&amp; a &lt;= b是写a == b的啰嗦方式。
    • @T.J.Crowder,不! a == b 比较引用,在我的情况下,我正在逐个元素比较数组,所以你错了。
    • 是的,== 使用数组会比较引用。但是,不是将两个数组都转换为字符串两次,而是按字典顺序进行操作(这不是正确的方法)是var same = String(myArray1) == String(myArray2);(或var same = myArray1.join() == myArray2.join() 或类似方法)。
    • @T.J.Crowder,同意这一点,但我的回答不值得反对(这是从你这边来的吗?),它有效,所以我看不出有任何错误的原因。
    • @Romko 感谢您的时间和精力。但这真的不是我想要或试图做的。
    猜你喜欢
    • 2012-05-20
    • 2013-01-27
    • 2014-08-11
    • 2020-12-27
    • 2021-02-09
    • 2014-05-15
    • 2020-05-27
    • 2015-06-18
    • 2022-12-20
    相关资源
    最近更新 更多