Miguel Rodrigues
Miguel Rodrigues

Reputation: 321

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?

Upvotes: 16

Views: 28484

Answers (4)

Rajganesh
Rajganesh

Reputation: 1

let array=[-2, 4, 3, 2, 1, 7, 6, 10, 8, 9]; //or [1,1,1,1,1,1,1,1,1] 
let result = "";
let fin = "";
let i = 0;
while (i <= array.length)
{
  i++;
 let temp = array[0]; //Assigning the first element of the array
  let temp1 = array[i]; //Assigning the elements through iterating the array
if (temp === temp1){ // If the value of the array is same as [1,1,1,...]
    fin = temp;
    result = temp1;
}
else if (temp > temp1){ // assign minimum value in result variable
  result = temp1;
}
else if(result < temp){ // assing minimum value in fin variable if the first element is minimum
 fin = result; 
}
}
if(fin < result){ // display the result
 console.log(fin); 
}else{            // display the result
console.log(result);
}

Upvotes: 0

Ele
Ele

Reputation: 33726

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();

Upvotes: 2

Nina Scholz
Nina Scholz

Reputation: 386530

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]));

Upvotes: 14

Timmmm
Timmmm

Reputation: 96547

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;
}

Upvotes: 2

Related Questions