Возвращаемый индекс наибольшего значения в массиве

У меня есть это:

var arr = [0, 21, 22, 7];

Какой лучший способ вернуть индекс самого высокого значения в другую переменную?

Ответ 1

Это, вероятно, лучший способ, поскольку он надежен и работает на старых браузерах:

function indexOfMax(arr) {
    if (arr.length === 0) {
        return -1;
    }

    var max = arr[0];
    var maxIndex = 0;

    for (var i = 1; i < arr.length; i++) {
        if (arr[i] > max) {
            maxIndex = i;
            max = arr[i];
        }
    }

    return maxIndex;
}

Theres также эта строка:

let i = arr.indexOf(Math.max(...arr));

Он выполняет вдвое больше сравнений, чем необходимо, и, тем не RangeError для больших массивов. Я придерживаюсь функции.

Ответ 2

В одной строке и, вероятно, быстрее, чем arr.indexOf(Math.max.apply(Math, arr)):

var a = [0, 21, 22, 7];
var indexOfMaxValue = a.reduce((iMax, x, i, arr) => x > arr[iMax] ? i : iMax, 0);

document.write("indexOfMaxValue = " + indexOfMaxValue); // prints "indexOfMaxValue = 2"

Ответ 3

Вот еще одно решение, если вы используете ES6 с использованием оператора спреда:

var arr = [0, 21, 22, 7];

const indexOfMaxValue = arr.indexOf(Math.max(...arr));

Ответ 4

Если я ошибаюсь, я бы сказал, чтобы он написал вашу собственную функцию.

function findIndexOfGreatest(array) {
  var greatest;
  var indexOfGreatest;
  for (var i = 0; i < array.length; i++) {
    if (!greatest || array[i] > greatest) {
      greatest = array[i];
      indexOfGreatest = i;
    }
  }
  return indexOfGreatest;
}

Ответ 5

Если вы используете подчеркивание, вы можете использовать этот красивый короткий лайнер:

_.indexOf(arr, _.max(arr))

Сначала он найдет значение самого большого элемента в массиве, в этом случае 22. Затем он вернет индекс, где 22 находится внутри массива, в этом случае 2.

Ответ 6

Другое решение макс с помощью reduce:

[1,2,5,0,4].reduce((a,b,i) => a[0] < b ? [b,i] : a, [Number.MIN_VALUE,-1])
//[5,2]

Возвращает [5e-324, -1] если массив пуст. Если вы хотите только индекс, поставьте [1] после.

Мин. Через (Изменить на > и MAX_VALUE):

[1,2,5,0,4].reduce((a,b,i) => a[0] > b ? [b,i] : a, [Number.MAX_VALUE,-1])
//[0, 3]

Ответ 7

РЕДАКТИРОВАТЬ: Несколько лет назад я дал ответ, который был грубым, слишком конкретным и слишком сложным. Так что я редактирую это. Я предпочитаю функциональные ответы выше для их аккуратного фактора, но не для их удобочитаемости; но если бы я был более знаком с javascript, то мне бы они тоже понравились.

Псевдокод:

Отслеживать индекс, который содержит наибольшее значение. Предположим, что индекс 0 является наибольшим изначально. Сравните с текущим показателем. Обновите индекс с наибольшим значением при необходимости.

Код:

var mountains = [3, 1, 5, 9, 4];

function largestIndex(array){
  var counter = 1;
  var max = 0;

  for(counter; counter < array.length; counter++){
    if(array[max] < array[counter]){
        max = counter;
    }
  }
  return max;
}

console.log("index with largest value is: " +largestIndex(mountains));
// index with largest value is: 3

Ответ 8

 var arr=[0,6,7,7,7];
 var largest=[0];
 //find the largest num;
 for(var i=0;i<arr.length;i++){
   var comp=(arr[i]-largest[0])>0;
      if(comp){
	  largest =[];
	  largest.push(arr[i]);
	  }
 }
 alert(largest )//7
 
 //find the index of 'arr'
 var arrIndex=[];
 for(var i=0;i<arr.length;i++){
    var comp=arr[i]-largest[0]==0;
	if(comp){
	arrIndex.push(i);
	}
 }
 alert(arrIndex);//[2,3,4]

Ответ 9

function findIndicesOf(haystack, needle)
{
    var indices = [];

    var j = 0;
    for (var i = 0; i < haystack.length; ++i) {
        if (haystack[i] == needle)
            indices[j++] = i;
    }
    return indices;
}

передать array в haystack и Math.max(...array) для needle. Это даст все максимальные элементы массива, и он будет более расширяемым (например, вам также нужно найти минимальные значения)

Ответ 10

Устойчивая версия этой функции выглядит следующим образом:

// not defined for empty array
function max_index(elements) {
    var i = 1;
    var mi = 0;
    while (i < elements.length) {
        if (!(elements[i] < elements[mi]))
            mi = i;
        i += 1;
    }
    return mi;
}

Ответ 11

ES6 Function.prototype.apply() представляется наиболее эффективным способом решения этой проблемы, передавая нулевое значение в качестве первого значения.

const num = [0, 21, 22, 7];

let greatestValue = Math.max.apply(null, num);


console.log(num.indexOf(greatest Value)); //2

Ответ 12

Самое простое решение:

Math.max(...array);