비교 기능과 함께 JavaScript에서 정렬 기능이 작동하는 방법
이미 질문했듯이 : 정렬 기능은 compare
함수 와 함께 JavaScript에서 어떻게 작동합니까? 배열이 있고 array.sort(compare)
지금은 compare
함수가 a-b
(배열의 두 인덱스)를 반환 하면 결과가 0보다 크거나 0보다 작거나 같은지 여부에 따라 작동 한다고 책에 기록되었습니다. 0.하지만 정확히 어떻게 작동합니까? 나는 그것을 해결할 수 없었다.
"비교"함수는 종종 a 및 b 라고하는 두 개의 인수를 가져야합니다 . 그런 다음 비교 함수가 이러한 값 a 및 b를 기반으로 0, 0보다 크거나 0보다 작게 반환하도록합니다 .
- a 가 b 보다 크면 0보다 큰 반환
- a가 b 와 같으면 0을 반환합니다 .
- a 가 b 보다 작 으면 0보다 작게 반환
이 세 개의 반환 값과 두 개의 인수 만 사용하면 모든 유형의 입력 데이터 유형 또는 복잡한 데이터 구조를 정렬 할 수있는 비교 함수를 작성할 수 있습니다.
그런 다음 사용자 정의 비교 함수를 사용하여 sort ()를 호출하면 적절한 순서를 결정하기 위해 정렬 대상 목록의 쌍에 대해 비교 함수가 호출됩니다.
간단한 예를 살펴 보겠습니다 ... 일부 숫자 만 정렬한다고 가정하면 매우 간단한 비교 기능이 있습니다.
function compare(a,b) {
return a - b;
}
a에서 b를 빼면 a가 b보다 크면 항상 0보다 크고, 같으면 0, a가 b보다 작 으면 0보다 작습니다. 따라서 비교 기능에 대한 요구 사항을 충족합니다.
이제 이것이 정렬 할 숫자 목록이라고 가정 해 보겠습니다.
var numbers = [1,5,3.14];
을 호출 numbers.sort(compare)
하면 내부적으로 실제로 실행됩니다.
compare(1,5); // Returns -4, a is less than b
compare(1,3.14); // Return -2.14, a is less than b
compare(5,3.14); // returns 1.86, a is greater than b
수동 정렬이나 알파벳 정렬을 해본 적이 있다면 아마 깨닫지 못한 채 똑같은 일을 한 것입니다. 비교할 항목이 수십 또는 수백 개에 달하더라도 한 번에 두 개의 숫자 (또는 저자의 성 등) 만 지속적으로 비교합니다. 다시 세 개의 숫자 목록을 살펴보면 처음 두 숫자를 비교하는 것으로 시작합니다.
- 1이 5보다 크거나 작습니까? 보다 작으므로 다음 두 숫자를 목록에 넣으십시오. 1,5
- 3.14가 1보다 크거나 작습니까? 보다 크므로 새 목록에서 1 다음에갑니다.
- 3.14가 새 목록에서 5보다 크거나 작습니까? 5보다 작으므로 5 이전으로 이동합니다. 새 목록은 이제 [1,3.14,5]입니다.
자신 만의 compare () 함수를 제공 할 수 있기 때문에 숫자뿐만 아니라 임의의 복잡한 데이터를 정렬 할 수 있습니다.
기본적으로 배열 sort()
방법은 알파벳 오름차순으로 정렬됩니다. 배열에 숫자 나 객체가 포함되어 있기 때문에 다른 순서로 정렬하려면 함수를 sort()
.
전달하는 함수는 종종 a와 b라고하는 두 개의 매개 변수를 사용하여 다음을 반환합니다. 첫 번째 인수가 두 번째 인수보다 먼저 정렬되어야하는 경우 음수 (a <b) 인수가 같으면 0 (a == b) a 양수 첫 번째 인수가 두 번째 인수 다음에 정렬되어야하는 경우 숫자 (a> b)
이제 핵심 비트sort()
가 있습니다 . 매개 변수로 전달하는 함수 sort()
는 전체 배열을 처리 할 때 반복적으로 호출 됩니다. sort()
배열에있는 사물의 데이터 유형을 알거나 신경 쓰지 않습니다. "항목 A가 항목 B보다 먼저 오는가?"를 알아야 할 때마다 함수를 호출 할뿐입니다. 에서 내부적으로 사용되는 정렬 알고리즘 유형에 대해 걱정할 필요가 없습니다 sort()
. 실제로 한 브라우저에서 다른 알고리즘을 사용할 수 있지만 배열에서 두 항목을 비교할 수있는 방법을 제공해야하기 때문에 괜찮습니다. .
함수는 if / else if / else
반환 할 결과를 결정 하는 구조를 가질 수 있지만 빼기 결과가 -ve, 0 또는 + ve가되고 숫자를 오름차순으로 올바르게 배치하기 때문에 단순히 (ab)를 반환하는 숫자의 경우이를 달성 할 수 있습니다. (ba)를 반환하면 내림차순으로 배치됩니다.
var sortedArray = myArray.sort(function(a,b){
return (a-b);
});
객체 배열이 있고 객체의 특정 속성이나 속성을 기준으로 정렬하려는 경우에도 그렇게 할 수 있습니다. 예를 들어 다음 형식의 객체를 가정합니다.
{ id : 1,
name : "Fred",
address : "12 Smith St",
phone : "0262626262" }
그런 다음 다음과 같이 'id'속성으로 이러한 개체의 배열을 정렬 할 수 있습니다.
var sortedArray = myArray.sort(function(a,b){
return (a.id - b.id);
});
또는 다음과 같이 '이름'속성 (알파벳순)으로 이러한 개체의 배열을 정렬 할 수 있습니다.
var sortedArray = myArray.sort(function(a,b){
if (a.name < b.name)
return -1;
else if (a.name == b.name)
return 0;
else
return 1;
});
마지막 예에서는 if / else if / else
앞서 언급 한 전체 구조를 넣었습니다 .
For the example where you are sorting objects with multiple properties you could expand that further to include a secondary sort, that is, (in my example) if the name properties are equal you could then return a comparison of, say, the phone property.
This method uses the syntax and parameters of the order of Array.sort (the compareFunction the sortOptions), whose parameters are defined as follows:
compareFunction - a comparison function used to determine the sort order of the array elements. This parameter is optional. The comparison function should be used to compare the two parameters. A and B of a given element, the result of compareFunction can have a negative value, 0 or a positive value:
If the return value is negative, it means that A appears before B in the sorted sequence. If the return value is 0, then A and B have the same sort order. If the return value is positive, it means that A appears after B in the sorted sequence.
sort method alone treat numbers as strings so if the array of strings you don't need the compare function. but if the array of numbers you need the compare function to alter the build behavior of the sort method.
ex1 :strings
var animals = ["Horse", "Cat", "Tiger", "Lion"];
animals.sort();
ex2 : numbers
var marks = [70, 90, 60, 80 ];
marks.sort(function(a, b){return a > b}); //ascending , a < b descending .
I think it may be like this(well, I am not sure about this.):
suppose the function compare(a,b)
is the compare function. It returns c
. suppose we are going to sort the entries in the arrayN
to get the sort result array M
.
I don't know the exact sort algorithm , and different browsers even return different results if c
is neither (a-b)
nor (b-a)
(say, if c
is "b-2"
, "a+b"
or some other expressions).
But according to ECMA-262
, the sort result should be like this:
a , b can be any two of the indexes. this means we actually passed an ordered pair to the compare function. eg: (0,1),(1,4), or even (2,0) , (2,1)
.
The ECMAScript Language Specification says the result should have this property: (a,b)
is an ordered pair passed to the compare function.
- if
c
(what the function returns) is less than zero, thenM(a)< M(b)
must be satisfied.
And the specification talks nothing about what would happen if c is zero or bigger than zero.
I am not sure whether this is right. At least this can easily explain why when c
is "a-b"
, the entries are sorted to be numerically and ascending, and why when c
is "b-a"
,the entries are sorted to the opposite.
Are the js engines of the browsers are not really designed strictly according to `ECMA-262 or am I totally wrong?
Reference:
'programing tip' 카테고리의 다른 글
MySQL 대 PostgreSQL? (0) | 2020.12.10 |
---|---|
Windows XP에서 MySQL 명령 줄 클라이언트를 통해 열린 MySQL 화면을 지우는 방법 (0) | 2020.12.10 |
유형 C #에서 케이스 전환 (0) | 2020.12.10 |
Java에서 ResultSet이 리턴 한 행 수 가져 오기 (0) | 2020.12.10 |
Mac OS X에 pdftk를 설치하는 방법 (0) | 2020.12.10 |