我需要比较一个数组中的所有值,以了解它们是否全部相等。 所以这很好,并给我预期的输出
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
}
));
答案 0 :(得分:7)
reduce
这里不是正确的工具,在一次迭代中返回的值在下一次迭代中用作a
,reduce
不会短路。
如果您想使用其中一种数组方法来执行此操作,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;