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

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

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

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

11 ответов


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

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

там также этот ОДН-вкладыш:

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

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


в одной строке и, вероятно, быстрее, чем 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"

где:

  • iMax - лучший индекс до сих пор (индекс элемента max до сих пор, на первой итерации iMax = 0 потому что второй аргумент reduce() is 0, мы не можем опустить второй аргумент reduce() в нашем случае)
  • x - текущий проверенный элемент из массива
  • i - в данный момент тестируется индекс
  • arr - наш массив ([0, 21, 22, 7])

о reduce() метод (из "JavaScript: The Definitive Guide" Дэвида Фланагана):

reduce () принимает два аргумента. Первая-это функция, которая выполняет операцию сокращения. Задача этой функции сокращения состоит в том, чтобы каким-то образом объединить или уменьшить два значения в одно значение и вернуть это уменьшенное значение.

функции используемые с уменьшают() отличается от функций, используемых с forEach () и map (). Знакомые значения value, index и array передаются в качестве второго, третьего и четвертого аргументов. Первый аргумент-это накопленный результат сокращения до сих пор. При первом вызове функции этот первый аргумент является начальным значением, которое вы передали как второй аргумент для уменьшения(). При последующих вызовах это значение, возвращаемое предыдущим вызовом функции.

при вызове reduce() без начального значения, он использует первый элемент массива в качестве начального значения. Это означает, что первый вызов функции сокращения будут иметь первый и второй элементы массива в качестве первый и второй доводы.


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

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

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

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

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

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

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

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


другое решение max с помощью 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] если массив пуст. Если вы хотите только индекс, put [1] после.

Min via (изменить на > и MAX_VALUE):

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

 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]

EDIT: много лет назад я дал ответ на этот вопрос, который был грубым, слишком конкретным и слишком сложным. Поэтому я его редактирую. Я предпочитаю функциональные ответы выше за их аккуратный фактор, но не их читаемость; но если бы я был более знаком с 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

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

Math.max(...array);

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

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

Кажется, что решение с помощью reduce можно упростить до:

arr.reduce((acc, cur) => Math.max(acc, cur))