[javascript] 정수 배열을 올바르게 정렬하는 방법

내가 정수를 포함한다는 것을 알고있는 배열에서 가장 높은 값과 가장 낮은 값을 얻으려고하면 생각보다 어려워 보입니다.

var numArray = [140000, 104, 99];
numArray = numArray.sort();
alert(numArray)

나는 이것이 보일 것으로 기대한다 99, 104, 140000. 대신에이 표시 104, 140000, 99됩니다. 따라서 정렬이 값을 문자열로 처리하는 것 같습니다.

정수 함수를 실제로 정렬하기 위해 정렬 함수를 얻는 방법이 있습니까?



답변

기본적으로 sort 메서드는 요소를 알파벳순으로 정렬합니다. 숫자로 정렬하려면 숫자 정렬을 처리하는 새 메소드를 추가하십시오 (아래에 표시된 sortNumber).

var numArray = [140000, 104, 99];
numArray.sort(function(a, b) {
  return a - b;
});

console.log(numArray);

ES6에서는 화살표 기능을 사용하여이를 단순화 할 수 있습니다.

numArray.sort((a, b) => a - b); // For ascending sort
numArray.sort((a, b) => b - a); // For descending sort

선적 서류 비치:

Mozilla Array.prototype.sort()는 Infinity 또는 NaN을 포함하지 않는 배열에 대해이 비교 기능을 권장합니다. ( Inf - Inf0이 아닌 NaN 이므로 ).

키별로 객체를 정렬하는 예제도 있습니다.


답변

위의 모든 대답을 바탕으로 다음과 같이 한 줄로 수행 할 수도 있습니다.

var numArray = [140000, 104, 99];

// ES5
numArray = numArray.sort(function (a, b) {  return a - b;  });

// ES2015
numArray = numArray.sort((a, b) => a - b);

//outputs: 99, 104, 140000


답변

array.sort 는 기본적으로 사전 식 정렬을 수행하며, 숫자 정렬의 경우 고유 한 기능을 제공합니다. 다음은 간단한 예입니다.

function compareNumbers(a, b)
{
    return a - b;
}

numArray.sort(compareNumbers);

또한 정렬은 “제자리에서”작동하므로 할당 할 필요가 없습니다.


답변

이 답변은 기존 답변 중 일부와 동일하지만 ECMAScript 6 화살표 함수 는 가독성을 희생하지 않고 인라인 정렬 함수를 정의 할 수있는 훨씬 더 간단한 구문을 제공합니다.

numArray = numArray.sort((a, b) => a - b);

오늘날 대부분의 브라우저 에서 지원됩니다 .


답변

모든 사람들이 비교 함수를 전달하도록 권장하는 이유가 놀랍습니다. 그러면 sort()정렬이 정말 느려집니다!

숫자를 정렬하려면 TypedArray를 만드 십시오 .

var numArray = new Uint32Array([140000, 104, 99]);
numArray = numArray.sort();
alert(numArray)


답변

정렬 기능이 너무 이상하게 작동하는 이유

로부터 문서 :

[…] 배열은 각 요소의 문자열 변환에 따라 각 문자의 유니 코드 코드 포인트 값에 따라 정렬됩니다.

배열 의 유니 코드 포인트 값 을 인쇄하면 명확 해집니다.

console.log("140000".charCodeAt(0));
console.log("104".charCodeAt(0));
console.log("99".charCodeAt(0));

//Note that we only look at the first index of the number "charCodeAt(  0  )"

“49, 49, 57″을 반환합니다.

49 (unicode value of first number at 140000)
49 (unicode value of first number at 104)
57 (unicode value of first number at 99)

이제 140000과 104가 같은 값을 반환했기 때문에 (49) 첫 번째 인덱스를 잘라 내고 다시 확인합니다.

console.log("40000".charCodeAt(0));
console.log("04".charCodeAt(0));

//Note that we only look at the first index of the number "charCodeAt(  0  )"

52 (unicode value of first number at 40000)
40 (unicode value of first number at 04)

이것을 정렬하면 다음과 같이됩니다.

40 (unicode value of first number at 04)
52 (unicode value of first number at 40000)

104는 140000 이전에옵니다.

최종 결과는 다음과 같습니다.

var numArray = [140000, 104, 99];
numArray = numArray.sort();
console.log(numArray)

104, 140000, 99

결론:

sort()숫자의 첫 번째 색인 만보고 정렬합니다. sort()정수가 다른 숫자보다 큰지 신경 쓰지 않고 숫자의 유니 코드 값을 비교하고 두 개의 동일한 유니 코드 값이 있으면 다음 숫자가 있는지 확인하고 비교합니다.

올바르게 정렬하려면 여기에sort() 설명 된 것처럼 비교 함수를 전달해야합니다 .


답변

그러나 사용하는 대신 aks에 동의합니다.

return a - b;

사용해야합니다

return a > b ? 1 : a < b ? -1 : 0;