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

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

[267, 306, 108]

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



답변

구조에 참여하십시오 :

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

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


답변

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

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


답변

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

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

출처 : Mozilla MDN


답변

저는 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)


답변

더 큰 배열 (~ 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;
}

벤치 마크 결과


답변

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

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


답변

이건 어때요:

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

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

console.log(largest);