Question: I wrote this function, which returns `-1`.

```js
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?

Answer: 
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 `...`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_syntax)).

In this case it follows this way

```
Math.max(...[11, 10, 10])

```

is evaluated as

```
Math.max(11, 10, 10)

```

```js
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.

```js
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]));
```
You can ask [Raymond Chen](https://devblogs.microsoft.com/oldnewthing/20140526-00/?p=903). 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;
}

```