[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