2013-02-17 3 views
4

다음 함수가 (코드의 세 번째 섹션에서) 숫자로 문자열을 정렬하는 이유를 이해하는 데 문제가 있습니다.자바 스크립트 .sort 매개 변수 이해

var myArray = [10, 44, 32, 100, 0, 44, 3, 4]; 
console.log(myArray.toString()); // 10, 44, 32, 100, 0, 44, 3, 4 --> unsorted 

myArray.sort(); 
console.log(myArray.toString()); // 0,10,100,3,32,4,44,44 --> sorted like strings 

// this is what confuses me: 
myArray.sort(function (a, b) { 
return a - b; 
}); 
console.log(myArray.toString()); // 0,3,4,10,32,44,44,100 --> sorted numerically 

특히 :

  1. 방법은 ab 채워합니까?

  2. a - b 숫자를 숫자 순서로 정렬하는 이유는 무엇입니까?

  3. 함수가 한 번에 2 개의 숫자 만 검사하는 경우 모든 숫자를 적절한 순서로 정렬하려면 어떻게합니까? (즉 ab)

+2

의 중복 가능성 [정말로 자바 스크립트 분류에서 일어나는] (http://stackoverflow.com/questions/8588921/what-really-happens-in-javascript-sort) –

답변

6

.sort은 선택적 매개 변수를 취합니다.이 매개 변수는 함수 여야합니다.

.sort은이 함수를 반복적으로 호출하여 배열의 값 쌍 (ab 매개 변수)을 전달합니다. 반환 값이 0보다 큰 경우 반환 값은 다음, 다음, a > b

  • 반환 값은 만약 a < b
  • 0보다 작은 경우

    • :이 기능은 다음과 같이 해석되는 값을 반환 다음이 사용 a == b

    정확히 0, .sort 수치 브라우저를 사용하도록 프로그램 된대로 정렬 알고리즘을 사용하여 항목의 순서가 부족합니다.

    정렬 기능이없는 경우 .sort은 항목을 문자열로 정렬합니다. 이는 디자인의 임의의 지점 일뿐입니다. 함수가 값을 숫자로 비교하도록 강제하는 경우와 같이 이상적으로는 .sort을 원할 때마다 사용할 함수를 전달해야합니다.

  • +1

    언제 중단해야하는지 어떻게 알 수 있습니까? 모든 숫자를 다른 모든 숫자와 비교합니까? – jon

    +1

    @jon [정렬 알고리즘] (http://en.wikipedia.org/wiki/Sorting_algorithm)의 작동 방식을 읽어 볼 수 있습니다. –

    0

    그 내용은 기본적으로 문자열처럼 자바 스크립트 .sort() 함수는 항상 배열을 정렬합니다. 그것은 그것이하는 것입니다. 기본적으로 기본 정렬 함수는 각 값에 .toString()을 수행합니다.

    Here's a link to the specification. 매우 혼란 스럽지만 중요한 점은 정렬 비교 프로세스에 대한 설명이 끝나갈 무렵입니다.

    +0

    그런데 왜 두 번째 부분의 작업을 수행 숫자로 정렬하도록 - 즉 어떻게 작동합니까? – jon

    +0

    @Jon 함수는 인자가 문자열이 아닌 숫자 인 것처럼 인자를 처리하기 때문입니다. 열쇠는 당신이 그 뺄셈을하고 있다는 것입니다. – Pointy

    3

    Array.prototype.sort의 기본 동작은 이유가 무엇이든간에 숫자가 아닌 문자열별로 정렬하는 것입니다. 즉, 숫자 정렬 동작을 정의해야합니다. 함수형 프로그래밍의 세계에 오신 것을 환영합니다 -

    1. 어떻게 ab을 채워 않습니다. 배열은 내부적으로 반복되고 콜백 함수는 요소가 다 소모 될 때까지 a (첫 번째 요소) 및 b (두 번째 요소)로 호출됩니다.당신은 이것에 대해 너무 많이 걱정할 필요가 없습니다, 그것이 일어난다는 것을 압니다.

    2. documentation은 상당히 명확합니다. 다행히도. 콜백의 반환 값이 0보다 작은 경우 ab보다 낮은 지수를가집니다. 0이 반환되면 다른 요소와 관련된 동일한 인덱스에 유지하십시오. 양수 값이 반환되면 ba보다 낮은 지수를가집니다. 이는 a - b이 숫자 정렬을 위해 올바르게 작동 함을 의미합니다. 그러나이면 숫자가 아닌 요소가 있으면이 콜백 함수로 문제가 발생합니다. 배열에 숫자 요소 만 포함되어 있다는 사실을 알고있는 경우에만 사용하십시오.

    3. 이것은 간단한 삽입 정렬을 수행하며 실제로 한 번에 두 개가 안되지만 ba보다 작 으면 다시 되돌아옵니다. 정렬 콜백 메소드에 console.log(a,b)을 추가하여이 동작을 검사 할 수 있습니다.

    +0

    '.sort()'메쏘드가 삽입 정렬이었고 quicksort (대게 가능하다) 나 merge sort가 아니라는 것을 알면 놀랄 것입니다. – Pointy

    +0

    나는'console.log (a, b)'를 함수 내부에 넣으려고했는데 작동하지 않았다 ... 나는 문제 단계를 통해 내 단계가 제대로 작동하는지보고 싶다. 나는 무엇을 잘못하고 있나 : https://gist.github.com/jonamar/4974057? – jon

    +1

    @jon은'return'이 무엇을하는지 생각합니다. 함수 오른쪽에서 빠져 나옵니다. 'return'과 * then *'console.log'를 호출하면, 후자는 절대로 도달하지 않을 것입니다, 맞습니까? 'return' 앞에'console.log'를 넣으십시오. –