JavaScript 배열에 포함 된 가장 큰 숫자를 어떻게 찾을 수 있습니까?


206

몇 개의 숫자를 포함하는 간단한 JavaScript Array 객체가 있습니다.

[267, 306, 108]

이 배열에서 가장 큰 숫자를 찾는 함수가 있습니까?


22
Math.max(...[267, 306, 108]);
Jacksonkr

답변:


315

구조에 참여하십시오 :

Array.max = function( array ){
    return Math.max.apply( Math, array );
};

경고 : 일부 VM의 경우 최대 인수 수는 65535 개 이므로 배열이 그렇게 작은 지 확실하지 않으면 for 루프를 사용하십시오.


15
아, 그러나 이제는 약간 비뚤어진 방식으로 SO 품질 스티커가 붙어 있습니다!
Shog9

2
FWIW, 성능이 솔루션의 한 요소라면, 쉽게 코딩 된 기능과 비교하여 성능이 우수한지 테스트합니다 . 우리는 기본 구현이 더 빠를 것이라고 가정하는 경향이 있습니다. 실제로, apply통화 비용은 이를 매우 쉽게 씻을 수 있습니다.
TJ Crowder

2
배열 길이가 매개 변수 개수 제한보다 큰 경우 어떻게합니까?
lukas.pukenis

3
@CrescentFresh : developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… 에 따르면 65535로 하드 코딩됩니다. 이에 따르면 code.google.com/p/v8/issues/detail?id = (172) 및 인수가 스택으로 푸시되는 지식으로 우리가 무제한이 아니다 것을 알고있다
lukas.pukenis

9
또한이 방법은 강력하지 않습니다. 배열이 mamximum 스택 크기보다 큰 경우 실패합니다.RangeError: Maximum call stack size exceeded.
Mark Lundin

197

apply 함수를 사용하여 Math.max 를 호출 할 수 있습니다 .

var array = [267, 306, 108];
var largest = Math.max.apply(Math, array); // 306

어떻게 작동합니까?

적용 함수 배열로 제공 주어진 컨텍스트와 인수와 다른 함수를 호출하는데 사용된다. min 및 max 함수는 임의의 수의 입력 인수를 사용할 수 있습니다. Math.max (val1, val2, ..., valN)

우리가 전화하면 :

Math.min.apply(Math, [1,2,3,4]);

적용 기능이 실행됩니다 :

Math.min(1,2,3,4);

첫 번째 매개 변수 인 컨텍스트는 정적이므로이 함수에는 중요하지 않으므로 컨텍스트로 전달되는 내용에 관계없이 작동합니다.


2
Whoa 당신은 많은 노력으로 답변을
썼습니다

1
훌륭합니다. 그러나 배열 길이가 매개 변수 크기 제한을 초과하면 어떻게됩니까? 그럼 뭐야?
lukas.pukenis

1
나는 모든 것이 무엇을하고 왜하는지 설명하기 때문에이 답변을 다른 사람들보다 더 좋아합니다. +1
Marvin

59

새로운 스프레드 연산자를 사용하는 가장 쉬운 구문 :

var arr = [1, 2, 3];
var max = Math.max(...arr);

출처 : Mozilla MDN



@Green FWIW에서 매개 변수 개수 제한은 65536 (최소한 Chrome에서는)입니다 ([source ( bugs.webkit.org/show_bug.cgi?id=80797)] ). 따라서 배열에 65536 개 이상의 요소가 있으면이 답변이 작동하지 않습니다.
mgthomas99

4
65536 누구에게나 충분해야합니다
vsync

41

저는 JS 전문가는 아니지만 이러한 방법이 어떻게 쌓이는 지 알고 싶었습니다. 이것이 기술적으로 성능을 테스트하는 올바른 방법인지는 모르겠지만 내 코드에서 볼 수 있듯이 하나씩 차례로 실행했습니다.

0 번째 값을 정렬하고 얻는 것은 최악의 방법입니다 (그리고 배열의 순서를 수정하므로 바람직하지 않을 수 있습니다). 다른 사람들에게는 수백만 개의 지표를 말하지 않는 한 그 차이는 무시할 수 있습니다.

100,000 개의 인덱스로 구성된 난수 배열로 5 회 실행 한 평균 결과 :

  • 했다 줄일 4.0392ms를 실행
  • Math.max.apply 를 실행하는 데 3.3742ms 가 걸렸습니다.
  • 정렬하고 0 값을 얻는 데 67.4724ms 가 걸렸습니다.
  • reduce () 내의 Math.max 를 실행하는 데 6.5804ms 가 걸렸습니다.
  • 사용자 정의 findmax 기능 을 실행하는 데 1.6102ms 가 걸렸습니다.

var performance = window.performance

function findmax(array)
{
  var max = 0,
      a = array.length,
      counter

  for (counter=0;counter<a;counter++)
  {
      if (array[counter] > max)
      {
          max = array[counter]
      }
  }
  return max
}

function findBiggestNumber(num) {
  var counts = []
  var i
  for (i = 0; i < num; i++) {
    counts.push(Math.random())
  }

  var a, b

  a = performance.now()
  var biggest = counts.reduce(function(highest, count){
        return highest > count ? highest : count
      }, 0)
  b = performance.now()
  console.log('reduce took ' + (b - a) + ' ms to run')

  a = performance.now()
  var biggest2 = Math.max.apply(Math, counts)
  b = performance.now()
  console.log('Math.max.apply took ' + (b - a) + ' ms to run')

  a = performance.now()
  var biggest3 = counts.sort(function(a,b){return b-a;})[0]
  b = performance.now()
  console.log('sorting and getting the 0th value took ' + (b - a) + ' ms to run')

  a = performance.now()
  var biggest4 = counts.reduce(function(highest, count){
        return Math.max(highest,count)
      }, 0)
  b = performance.now()
  console.log('Math.max within reduce() took ' + (b - a) + ' ms to run')

  a = performance.now()
  var biggest5 = findmax(counts)
  b = performance.now()
  console.log('custom findmax function took ' + (b - a) + ' ms to run')
  console.log(biggest + '-' + biggest2 + '-' + biggest3 + '-' + biggest4 + '-' + biggest5)

}

findBiggestNumber(1E5)

7
나에게 이것은 이것이이 질문에 대한 가장 좋은 대답입니다.
rzelek

1
jsperf tests위의 내용을 위해 만들었습니다
vsync

37

더 큰 배열 (~ 100k 요소)의 경우 실제로는 다음 for보다 ~ 30 % 더 나은 성능 을 보이는 겸손한 루프로 배열을 반복하는 것으로 지불합니다 Math.max.apply().

function mymax(a)
{
    var m = -Infinity, i = 0, n = a.length;

    for (; i != n; ++i) {
        if (a[i] > m) {
            m = a[i];
        }
    }

    return m;
}

벤치 마크 결과


3
FWIW는, 크롬 31 일 현재 84 %로 나온다
일란 스코 비아

31

배열을 내림차순으로 정렬하고 첫 번째 항목을 가져올 수 있습니다.

[267, 306, 108].sort(function(a,b){return b-a;})[0]

4
마지막 항목을 정렬하고 얻을 수도 있다고 가정합니다 ...?
Shog9

@ Shog9 : 예. 그러나 비교 기능을 직접 지정해야합니다.sort(function(a,b){return b-a;})
Gumbo

9
아 나는 다음과 같이 더 생각했다 :[...].sort().pop()
Shog9

4
"숫자를 찾는하여 정렬 순서-N 소요는 사용 된 정렬 알고리즘에 dependig, 순서 (N 제곱)에 (N N 로그) 순서 사이에 필요"- webmasterworld.com/forum91/382.htm을
마르코 Luglio에게

2
또한 배열을 정렬하므로 원하는 부작용 일 수도 있고 아닐 수도 있습니다. 적용 솔루션의 성능이 향상되고 부작용이 없습니다.
Caleb

28

이건 어때요:

var arr = [1,2,3,4];

var largest = arr.reduce(function(x,y){
       return (x > y) ? x : y;
});

console.log(largest);

이 답변을 먼저 보았습니다 (현재 목록의 맨 아래에 있음). 나는 두 시간을 절약했을 것입니다.
user139301

1
Math.max 접근 방식이 아마도 가장 표준이지만 배열이 너무 클 때 스택 오버플로가 발생했습니다 (500K). 이 답변은 빠르고 효율적이며 내가 직접 사용하는 답변이므로이 답변을지지합니다.
Jay

8

Array.reduce 를 사용하는 방법은 무엇입니까?

[0,1,2,3,4].reduce(function(previousValue, currentValue){
  return Math.max(previousValue,currentValue);
});

초기 값은로 설정해야합니다 -Infinity.
Ja͢ck

@ 잭, 왜 이것이 필요한가요? 모든 음수의 배열로도 유효한 결과를 얻습니다.
CodeToad

1
배열이 비어있는 경우입니다.
Ja͢ck

5

거의 모든 대답 Math.max.apply()은 멋지고 멋지지만 제한이 있습니다.

함수 인수는 단점이있는 스택에 배치됩니다. 따라서 배열이 제한보다 크면 실패합니다.RangeError: Maximum call stack size exceeded.

호출 스택 크기를 찾으려면이 코드를 사용했습니다.

var ar = [];
for (var i = 1; i < 100*99999; i++) {
  ar.push(1);
  try {
    var max = Math.max.apply(Math, ar);
  } catch(e) {
    console.log('Limit reached: '+i+' error is: '+e);
    break;
  }
}

내 컴퓨터 -591519의 FireFox에서 가장 큰 것으로 나타 났습니다 . 이는 배열에 591519 개 이상의 항목이 포함 된 경우 RangeErrorMath.max.apply() 가 발생 함을 의미합니다 .

이 문제에 대한 가장 좋은 해결책은 반복적 인 방법입니다 (신용 : https://developer.mozilla.org/ ).

max = -Infinity, min = +Infinity;

for (var i = 0; i < numbers.length; i++) {
  if (numbers[i] > max)
    max = numbers[i];
  if (numbers[i] < min)
    min = numbers[i];
}

내 블로그에이 질문에 대해 쓴 여기 .


1
이 불공평. 여기에 답변이 필요합니다. 다른 타사 리소스에 대한 링크가 아닙니다. 특히 "여기에있는 모든 것이 나쁘지만 가자, 내 블로그에서 너무 좋아요 ..."와 결합 될 때
osa

@SergeyOrshanskiy는 새로운 insigths 및 솔루션으로 업데이트되는 경우 타사에 대한 링크가 매우 잘 작동합니다. 또한 기분이 상할 필요가 없습니다. 사람들은 단지 당신의 문제도 해결하고 싶어합니다. 나도 그것을 해결하고 싶었으므로 내 블로그에 그것에 대해 썼다
lukas.pukenis


5

최대 및 최소값을 쉽고 수동으로 찾는 방법. 이 코드는 다음보다 훨씬 빠릅니다 Math.max.apply. 배열에서 최대 1000k 개의 숫자를 시도했습니다.

function findmax(array)
{
    var max = 0;
    var a = array.length;
    for (counter=0;counter<a;counter++)
    {
        if (array[counter] > max)
        {
            max = array[counter];
        }
    }
    return max;
}

function findmin(array)
{
    var min = array[0];
    var a = array.length;
    for (counter=0;counter<a;counter++)
    {
        if (array[counter] < min)
        {
            min = array[counter];
        }
    }
    return min;
}

findmax()배열에 음수 만 있으면 잘못된 결과를 제공합니다. findmin()빈 배열에 대해 잘못된 결과를 제공합니다.
Ja͢ck


3

물론 존재합니다 : Math.max.apply(null,[23,45,67,-45]) 그리고 결과는 67;



1

Function.prototype.bind을 사용하여 "전부" 기능을 수행 할 수 있다는 것을 잊지 마십시오 .

var aMax = Math.max.apply.bind(Math.max, Math);
aMax([1, 2, 3, 4, 5]); // 5

1

Array이 기능을 확장 하여 모든 배열의 일부로 만들 수도 있습니다.

Array.prototype.max = function(){return Math.max.apply( Math, this )};
myArray = [1,2,3];

console.log( myArray.max() );

1
대단히 비효율적입니다.
Frank Schmitt

@ FrankSchmitt, 감사합니다, 동의합니다. 원래의 대답은 좋은 해결책이 아니 었습니다. 기본적으로 정렬은 숫자를 정렬하지 않으며 요소를 문자열로 취급합니다. 올바른 정렬을 위해 내 답변을 편집했습니다.
Izz

그건 내 요점이 아니 었어 최대 값을 찾기 위해 배열을 정렬하는 것은 적어도 N log N 연산이 필요하지만 최대 값을 찾는 것은 N 연산에서 수행 될 수 있기 때문에 매우 비효율적입니다.
Frank Schmitt

1

forEach를 사용할 수도 있습니다 .

var maximum = Number.MIN_SAFE_INTEGER;

var array = [-3, -2, 217, 9, -8, 46];
array.forEach(function(value){
  if(value > maximum) {
    maximum = value;
  }
});

console.log(maximum); // 217


1

사용- Array.prototype.reduce()멋지다!

[267, 306, 108].reduce((acc,val)=> (acc>val)?acc:val)

여기서 acc = 누산기val = 현재 값 ;

var a = [267, 306, 108].reduce((acc,val)=> (acc>val)?acc:val);

console.log(a);


1

당신은 이것을 시도 할 수 있습니다

var arr = [267,306,108];
var largestNum = 0;
for(i=0;i<arr.length;i++) {
   if(arr[i]>largest){
    var largest = arr[i];
   }
}
console.log(largest);

1

방금 JS로 시작했지만이 방법이 좋을 것이라고 생각합니다.

var array = [34, 23, 57, 983, 198];<br>
var score = 0;

for(var i = 0; i = array.length; i++) {
  if(array[ i ] > score) {
    score = array[i];
  }
}

array음수 만 포함 하면 문제가 발생합니다 .
Teepeemm

0

다차원 배열에서 가장 큰 숫자 찾기

var max = []; 

for(var i=0; arr.length>i; i++ ){

   var arra = arr[i];
   var largest = Math.max.apply(Math, arra);
   max.push(largest);

   }
return max;

특히 이미 다른 답변이 여러 개인 경우 코드에 정교한 설명을 추가하는 것이 좋습니다. 왜 이것이 다른 / 더 나은가?
Bowdzone

@Bowdzone, 의견 주셔서 감사합니다. 이 방법은 몇 가지 방법에 대한 약간의 지식으로 이해하기 쉽게 만드는 매우 기본적인 것입니다.
Liveindream

이것은 가장 큰 수를 반환하지 않고 다차원 배열에서 각 배열의 가장 큰 수의 배열을 반환합니다. 당신은 예를 추가해야합니다 var tmax = Math.max.apply(Math, max), 또는 더 나은 아직,에 루프 기능 등의 폐쇄를 사용 stackoverflow.com/a/54980012/7438857 . 이 수정을 사용하면 "다차원 배열에서 가장 큰 숫자를 찾는 방법"또는 stackoverflow.com/questions/32616910/… 에서 별도의 질문에 더 잘 대답 할 수 있습니다 . WIP : jsfiddle.net/jamesray/3cLu9for/8 .
James Ray

stackoverflow.com/a/32617019/7438857 은 올바른 질문에 대한 더 나은 답변이지만,이 답변은 위의 질문에 대한 답변은 아니지만 다차원 배열 내의 각 배열에서 가장 큰 수를 반환합니다.
James Ray

0

이것을 실행하십시오 :

Array.prototype.max = function(){
    return Math.max.apply( Math, this );
};

그리고 이제 [3,10,2].max()반품을 시도하십시오10


0

Bubble Sort를 사용하여 최대 값과 최소값 찾기

    var arr = [267, 306, 108];

    for(i=0, k=0; i<arr.length; i++) {
      for(j=0; j<i; j++) {
        if(arr[i]>arr[j]) {
          k = arr[i];
          arr[i] = arr[j];
          arr[j] = k;
        }
      }
    }
    console.log('largest Number: '+ arr[0]);
    console.log('Smallest Number: '+ arr[arr.length-1]);


1
(1) Javascript 배열에는 이미 O (n log n) 정렬 기능이 있습니다. (2) 버블 정렬은 O (n ^ 2)입니다. (3) 최소값과 최대 값을 찾는 것은 O (n)입니다.
Teepeemm

0

이 시도

function largestNum(arr) {
  var currentLongest = arr[0]

  for (var i=0; i< arr.length; i++){
    if (arr[i] > currentLongest){
      currentLongest = arr[i]
    }
  }

  return currentLongest
}

1
이 답변이이 페이지의 다른 많은 답변과 실질적으로 다른가요?
Teepeemm

0

크게 놓친 것 같은 @Quasimondo의 의견 에 따르면 다음은 https://jsperf.com/finding-maximum-element-in-an-array 와 같이 최상의 성능을 보이는 것 같습니다 . 참고 문제의 배열, 성능이 큰 영향이 없을 수 있지만, 큰 배열의 성능이 더 중요하고 다시되고 있다는 등의 언급 사용하여 Math.max()배열 길이도 이상 65535 페이지의 경우하지 않습니다도 일을 이 답변 .

function largestNum(arr) {
    var d = data;
    var m = d[d.length - 1];
    for (var i = d.length - 1; --i > -1;) {
      if (d[i] > m) m = d[i];
    }
    return m;
}

0

삼항 연산자를 사용하여 수행하는 방법에 대한 재귀 적 접근

const findMax = (arr, max, i) => arr.length === i ? max :
  findMax(arr, arr[i] > max ? arr[i] : max, ++i)

const arr = [5, 34, 2, 1, 6, 7, 9, 3];
const max = findMax(arr, arr[0], 0)
console.log(max);


0

하나의 for/of루프 솔루션 :

const numbers = [2, 4, 6, 8, 80, 56, 10];


const findMax = (...numbers) => {
  let currentMax = numbers[0]; // 2

  for (const number of numbers) {
    if (number > currentMax) {
      console.log(number, currentMax);
      currentMax = number;
    }
  }
  console.log('Largest ', currentMax);
  return currentMax;
};

findMax(...numbers);

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.