检查所有数组值是否与reduce()相同

时间:2017-01-10 10:02:50

标签: javascript arrays

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

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
  }
));

4 个答案:

答案 0 :(得分:7)

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初始化标志,然后传播&&的结果,并检查该数组第一个条目的条目:

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
));

答案 1 :(得分:0)

你可以使用reduce(代码中的解释)

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

var isEqual = myArray1.reduce(function(res, v1, idx) {
    var v2 = myArray2[idx]; // value from other array at same index
    return res && v1 === v2; // if result is true so far AND also the current values are equal
}, true) // start the evaluation with true so that initially res will be true -> once at least one v1 === v2 will yield false, res will be false from then on

注意:这仅适用于假设您的阵列存在而非空且大小相等的情况。您可以调整以支持这些例外情况

答案 2 :(得分:0)

通常的方法是使用.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。如果您的输入数组已满false s。

,则上述代码将失败

答案 3 :(得分:-1)

尝试(如果它们是数字)这样

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

var same = myArray1 >= myArray2 && myArray1 <= myArray2;