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


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

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

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

11 79

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

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

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

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

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

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

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 с помощью оператора spread:

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] если массив пуст. Если вам нужен только индекс, поставьте [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))