결론적으로 납득은 했으나 이해는 하지 못했다.
일단 a는 뒤쪽에 있는 값, b는 앞쪽에 있는 값으로 생각하기로 했다.
그리고 음수를 반환하면 뒤쪽에 있는 값과 앞쪽에 있는 값을 바꿔라
양수를 반환하면 그대로 두어라.
예를 들면,
// 오름차순 정렬
let array = [4, 2, 3, 1, 5];
array.sort((a, b) => {
return a - b
})
// a는 2, b는 4, a-b는 음수니까 2와 4의 순서를 바꿔서 array는 [2, 4, 3, 1, 5]
// ...
// [1, 2, 3, 4, 5]
콜백함수가 제공되지 않으면 요소를 문자열로 변환하고, 유니 코드 값 순서대로 문자열을 비교하여 정렬됩니다.
let array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
let newArray = array.sort();
console.log(newArray);
// [1, 10, 2, 3, 4, 5, 6, 7, 8, 9]
compareFunction(a, b)의 반환값이 0보다 작은 경우(음수) a를 b보다 낮은 색인으로 정렬합니다. 즉, a가 먼저옵니다.
compareFunction(a, b)이 0을 반환하면 a와 b를 서로에 대해 변경하지 않고 모든 다른 요소에 대해 정렬합니다.
compareFunction(a, b)의 반환값이 0보다 큰 경우(양수), b를 a보다 낮은 인덱스로 소트합니다. 즉, b가 먼저옵니다.
array의 index가 작은 원소가 b, 큰 원소가 a가 됩니다.
return이 음수면 자리바꿈, 양수는 현상 유지합니다.
let array = [4, 2, 3, 1, 5];
array.sort((a, b) => {
console.log(a, b)
return 1
})
// [4, 2, 3, 1, 5]
[(4), (2), 3, 1, 5]
a: 2, b: 4
[4, (2), (3), 1, 5]
a: 3, b: 2
[4, 2, (3), (1), 5]
a: 1, b: 3
[4, 2, 3, (1), (5)]
a: 5, b: 1
let array = [4, 2, 3, 1, 5];
array.sort((a, b) => {
console.log(a, b)
return -1
})
// [5, 1, 3, 2, 4]
[(4), (2), 3, 1, 5]
a: 2, b: 4
[4, (2), (3), 1, 5]
a: 3, b: 2
[4, 2, (3), (1), 5]
a: 1, b: 3
[4, 2, 3, (1), (5)]
a: 5, b: 1
let array = ['apple', 'abc', 'xylophone', 'banana', 'elo'];
const sorted = array.sort((a, b) => {
return a < b ? -1 : a > b ? 1 : 0;
})
console.log(sorted)
// ['abc', 'apple', 'banana', 'elo', 'xylophone']
let array = ['apple', 'abc', 'xylophone', 'banana', 'elo'];
const sorted = array.sort((a, b) => {
return a > b ? -1 : a < b ? 1 : 0;
})
console.log(sorted)
// ['xylophone', 'elo', 'banana', 'apple', 'abc']
참조 문자열이 정렬 순으로 지정된 문자열 앞 혹은 뒤에 오는지 또는 동일한 문자열인지 나타내는 수치를 반환합니다.
compareString 전에 referenceStr이 오면 음수를 반환합니다.(compareString < referenceStr)
compareString 뒤에 referenceStr이 오면 양수를 반환합니다.(compareString > referenceStr)
동등한 경우 0 을 반환합니다.
referenceStr.localeCompare(compareString, locales, options);
referenceStr과 비교되는 문자열a와 b의 비교를 통해서 양수인지 음수인지 판별 후에 순서를 교체합니다.
return이 a-b가 양수일 경우 index가 큰 원소가 크기 때문에 자리를 교체합니다.
음수일 경우 index가 작은 원소가 크기 때문에 자리를 교체하지 않습니다.
let array = [4, 2, 3, 1, 5];
array.sort((a, b) => {
return a - b
})
// [1, 2, 3, 4, 5]
[(4), (2), 3, 1, 5]
a: 2, b: 4
[4, (2), (3), 1, 5]
a: 3, b: 2
[(4), 2, (3), 1, 5]
a: 3, b: 4
[4, (2), (3), 1, 5]
a: 3, b: 2
[4, 2, (3), (1), 5]
a: 1, b: 3
[4, (2), 3, (1), 5]
a: 1, b: 2
[4, 2, (3), 1, (5)]
a: 5, b: 3
[(4), 2, 3, 1, (5)]
a: 5, b: 4
let array = [4, 2, 3, 1, 5];
array.sort((a, b) => {
return b - a
})
// [5, 4, 3, 2, 1]
[(4), (2), 3, 1, 5]
a: 2, b: 4
[4, (2), (3), 1, 5]
a: 3, b: 2
[(4), 2, (3), 1, 5]
a: 3, b: 4
[4, (2), (3), 1, 5]
a: 3, b: 2
[4, 2, (3), (1), 5]
a: 1, b: 3
[4, (2), 3, (1), 5]
a: 1, b: 2
[4, 2, (3), 1, (5)]
a: 5, b: 3
[(4), 2, 3, 1, (5)]
a: 5, b: 4
내부 동작이 궁금해서 다른분들이 설명하신 글을 찾아봤습니다.
그리고 그럴싸한 설명들을 혼자 콘솔로 찍어서 확인해 봤는데 확인했을 때 결과와 일치하는 설명은 찾지 못했습니다.
또 브라우저에 따라 내부 알고리즘이 다르다는 의견도 있는 것 같아서 혼란이 오는 상황입니다.
[(4), (2), 3, 1, 5] 음수 a: 2, b: 4
[(2), (4), 3, 1, 5]
[(2), 4, (3), 1, 5] 양수 a: 3, b: 2
[2, (4), (3), 1, 5] 음수 a: 3, b: 4
[2, (3), (4), 1, 5]
[(2), (3), 4, 1, 5] 양수 a: 3, b: 2
[2, (3), 4, (1), 5] 음수 a: 1, b: 3
[2, (1), 4, (3), 5]
[(2), (1), 4, 3, 5] 음수 a: 1, b: 2
[(1), (2), 4, 3, 5]
[1, 2, 4, (3), (5)] 양수 a: 5, b: 3
[1, 2, (4), 3, (5)] 양수 a: 5, b: 4
어떤 정렬을 사용하는 걸까...
const a = [[9, 3], [5, 5], [1,9],[1, 6], [2,3], [5, 3]]
console.log(a.sort())
// [[1, 6], [1, 9], [2, 3], [5, 3], [5, 5], [9, 3]]
배열의 첫 번째 원소를 먼저 비교하고, 두 번째 원소를 비교합니다.