'How to get the index of the min value in an array using JavaScript?
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?
Solution 1:[1]
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]));
Solution 2:[2]
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();
Solution 3:[3]
You can ask Raymond Chen. It turns out the obvious C-style way is the best. Perhaps unsurprisingly - C style code is easy for Javascript engines to optimise.
function indexOfSmallest(a) {
var lowest = 0;
for (var i = 1; i < a.length; i++) {
if (a[i] < a[lowest]) lowest = i;
}
return lowest;
}
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | |
| Solution 2 | |
| Solution 3 | Timmmm |
