[javascript] 배열에서 가장 큰 값의 인덱스를 반환

나는 이것을 가지고있다:

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

가장 높은 값의 인덱스를 다른 변수에 반환하는 가장 좋은 방법은 무엇입니까?



답변

신뢰할 수 있고 오래된 브라우저에서 작동하기 때문에 이것이 가장 좋은 방법 일 것입니다.

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()메소드 정보 (David Flanagan의 “JavaScript : The Definitive Guide”에서 제공) :

reduce ()는 두 개의 인수를 취합니다. 첫 번째는 축소 작업을 수행하는 기능입니다. 이 축소 기능의 임무는 어떻게 든 두 값을 단일 값으로 결합하거나 줄이고 그 감소 된 값을 반환하는 것입니다.

reduce ()에 사용 된 함수는 forEach () 및 map ()에 사용 된 함수와 다릅니다. 익숙한 값, 인덱스 및 배열 값이 두 번째, 세 번째 및 네 번째 인수로 전달됩니다. 첫 번째 주장은 지금까지 축소 된 누적 결과입니다. 함수에 대한 첫 번째 호출에서이 첫 번째 인수는 reduce ()에 대한 두 번째 인수로 전달한 초기 값입니다. 후속 호출에서는 이전 함수 호출에서 리턴 된 값입니다.

초기 값없이 reduce ()를 호출하면 배열의 첫 번째 요소를 초기 값으로 사용합니다. 이는 감소 함수에 대한 첫 번째 호출이 첫 번째 및 두 번째 배열 요소를 첫 번째 및 두 번째 인수로 갖게됨을 의미합니다.


답변

스프레드 연산자를 사용하여 ES6을 사용하는 경우 다른 솔루션이 있습니다.

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

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


답변

내가 실수하지 않는 한, 나는 당신 자신의 기능을 작성해야한다고 말하고 싶습니다.

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


답변

밑줄을 사용하는 경우이 멋진 짧은 원 라이너를 사용할 수 있습니다.

_.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] .

최소 경유 ( >및로 변경 MAX_VALUE) :

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


답변

편집 : 몇 년 전에 나는 거칠고 너무 구체적이며 너무 복잡한 이것에 대한 대답을했습니다. 편집하고 있습니다. 나는 그들의 깔끔한 요소에 대해서는 위의 기능적 답변을 선호하지만 가독성은 좋지 않습니다. 그러나 내가 자바 스크립트에 더 익숙하다면 나도 그것을 좋아할 것입니다.

의사 코드 :

가장 큰 값을 포함하는 색인을 추적하십시오. 인덱스 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