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]));
The problem in your approach is the complete array you're passing on the function Math.max
:
const arrayEdificiosNiveis = [11, 10, 10],
max = Math.max(...arrayEdificiosNiveis);
console.log(arrayEdificiosNiveis.findIndex(elem => elem === max));
If it's not possible to use Spread syntax
, you can call the function apply
which receives an array as the parameters of function Math.max
function sayHello() {
const arrayEdificiosNiveis = [11, 10, 10],
max = Math.max.apply(null, arrayEdificiosNiveis),
indexMenor = arrayEdificiosNiveis.indexOf(max);
console.log(indexMenor);
}
sayHello();
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