I wrote this function, which returns -1
.
function sayHello() {
let arrayEdificiosNiveis = [11,10,10];
var indexMenor = arrayEdificiosNiveis.indexOf(Math.max(arrayEdificiosNiveis));
console.log(indexMenor);
}
sayHello();
I expected 0, not -1. How do I solve this problem?
You need to spread the array for getting the maximum. Otherwise you get NaN
as value (via a stringed array) and this is not in the array (and not searchable).
A spreaded array takes all elements as parameter for the function (spread syntax ...
).
In this case it follows this way
Math.max(...[11, 10, 10])
is evaluated as
Math.max(11, 10, 10)
function sayHello() {
arrayEdificiosNiveis = [11, 10, 10];
var indexMenor = arrayEdificiosNiveis.indexOf(Math.max(...arrayEdificiosNiveis));
console.log(indexMenor);
}
sayHello();
A single loop solution:
But why not use
v > a[r] ? i : r
(which feels more natural, sort of) instead of
v <= a[r] ? r : i
The problem is the first comparison with the first element at index zero. at this time, r = -1
and the element is a[r] = undefined
.
A comparison with undefined
and a relational operator of <
, <=
, >
or >=
is always false
and that would return the wrong index of -1
instead of zero and this result does not change for any other element of the array.
const
getFirstIndexOfMaxValue = array =>
array.reduce((r, v, i, a) => v <= a[r] ? r : i, -1);
console.log(getFirstIndexOfMaxValue([]));
console.log(getFirstIndexOfMaxValue([11]));
console.log(getFirstIndexOfMaxValue([11, 10]));
console.log(getFirstIndexOfMaxValue([11, 10, 10]));
console.log(getFirstIndexOfMaxValue([10, 11, 10]));
console.log(getFirstIndexOfMaxValue([10, 11, 10, 11]));