I need to compare all values in ONE array to know if they're all equal or not. So this works fine and gives me the expected output
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
Then I've tried the same with reduce() but looks like I'm misunderstanding that function. They both say it is false. Am I doing something obviously wrong? Can I use reduce()
to get what I need? If so how?
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
just isn't the right tool here, the value you return from one iteration is used as a
in the next iteration, and reduce
doesn't short-circuit.
If you want to use one of the array methods to do this, every
would be a reasonable choice:
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
short-circuits, stopping as soon as the result is known.
I mean, you could shoe-horn it into a reduce
, but it's not appropriate. We initialize the flag with true
and then propagate the result of &&
'ing it with checking that entry against the array's first entry:
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
));
The normal way is to use the .every()
functor. If insisted i would come up with a .reduce()
solution as follows;
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);
It will return the element that's the array is filled with or false
if there is a black sheep. The above code will fail if your input array is full of false
s.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With