
์๊ฐ๋ณด๋ค sort()๋ฅผ ์ฌ์ฉํ ์ผ์ด ๋ง์๋ฐ ์ฌ์ฉํ ๋๋ง๋ค ํท๊ฐ๋ ค์ ๋ค์ ์ ๋ฆฌํ๋ค. ๋ฑ ๋
1. sort()๋ 2๊ฐ์ง ๋ชจ๋๋ก ์์ง์ธ๋ค
์ฒซ๋ฒ์งธ๋ ๊ธฐ๋ณธ ์ ๋ ฌ ๋ชจ๋
๋๋ฒ์งธ๋ ๋น๊ตํจ์(์ฝ๋ฐฑ) ์ ๋ ฌ ๋ชจ๋
๋ด๊ฐ ๋ง์ด ์ฌ์ฉํ๊ฑด ๋น๊ตํจ์ ์ ๋ ฌ์ด์๋๋ฐ ์ผ๋จ ๋ ๋ค ์์๋ณด์!
1๏ธโฃ ๊ธฐ๋ณธ ์ ๋ ฌ - ์๋ฌด๊ฒ๋ ๋๊ธฐ์ง ์์ ๋
๊ธฐ๋ณธ์ ์ผ๋ก ์ด๋ ๊ฒ ์๊ฒผ๋ค.
arr.sort();
sort()์ ์๋ฌด ๋น๊ต ํจ์(Comparison Function)๋ฅผ ์ ๋ฌํ์ง ์์ผ๋ฉด ๋ฐฐ์ด์ ์์๋ค์ ๋ฌธ์์ด๋ก ๋ณํ๋ ๋ค ์ ๋์ฝ๋ ๊ฐ์ ๋ฐ๋ผ ์ ๋ ฌ๋๋ค.
์ด๋ฌํ ๊ฒฝ์ฐ ๋ฌธ์์ด ๋ฐฐ์ด์์ ์์๋๋ก ์๋ํ ์ ์์ง๋ง ์ซ์ ๋ฐฐ์ด์ ์ด์ํ๊ฒ ๋ฐฐ์ดํ ์ ์๋ค.
(1) ๋ฌธ์์ด ๋ฐฐ์ด
๊ฐ ๋ฌธ์์ด์ ์ ๋์ฝ๋ ๊ฐ์ ๋ฐ๋ผ ๋น๊ตํ๋ฏ๋ก ์ผ๋ฐ์ ์ธ ์ฌ์ ์ ์ ๋ ฌ๊ณผ ๋์ผํ๊ฒ ์๋ํ๋ค.
const fruits = ['Banana', 'Apple', 'Cherry', 'Zebra', 'apple']
fruits.sort()
console.log(fruits) // ["Apple", "Banana", "Cherry", "Zebra", "apple"]
์์ ๊ฐ์ด ์ถ๋ ฅ๋๋ ์ด์ ๋ ๋๋ฌธ์(A,B,C,Z)๊ฐ ์๋ฌธ์(a)๋ณด๋ค ์ ๋์ฝ๋ ๊ฐ์ด ์๊ธฐ ๋๋ฌธ์ด๋ค
- ๋๋ฌธ์ 'A': U+0041 (16์ง์)
- ์๋ฌธ์ 'a': U+0061 (16์ง์)
(2) ์ซ์ ๋ฐฐ์ด
์ซ์ ๋ฐฐ์ด์์ ๊ฐ ์ซ์๊ฐ ๋ฌธ์์ด๋ก ๋ณํ๋ ํ ์ ๋ ฌ๋๊ธฐ ๋๋ฌธ์ ์ซ์์ ํฌ๊ธฐ๊ฐ ์๋ ์ฒซ๋ฒ์งธ ๋ฌธ์์ ์ ๋์ฝ๋๊ฐ์ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌ๋๋ค. ๊ทธ๋์ ์ ํํ ์ซ์ ์์๋ก ์ ๋ ฌ๋์ง ์์.
const number = [10, 5, 200, 1, 50]
number.sort()
console.log(number) // [1, 10, 200, 5, 50]
- 1: U+0031
- 2: U+0032
- 5: U+0035
๋ฐ๋ผ์ ์ซ์๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ์ ๋ ฌํ๊ณ ์ถ์ผ๋ฉด ๋น๊ต ํจ์๋ฅผ ์ ๋ฌํด์ผ ํ๋ค.
2๏ธโฃ ๋น๊ต ํจ์(=์ฝ๋ฐฑ) ์ ๋ ฌ - ์ง์์ฌํญ์ ๋๊ธธ ๋
arr.sort((a, b) => { ... });
์ฌ๊ธฐ์ ๋ด๊ฐ ์์ฑํ ์ฝ๋ฐฑ ํจ์์ ๋ฐ๋ผ ์ ๋ ฌํ๋ค.
์ซ์ ์ ๋ ฌ ๋ฟ ๋ง ์๋๋ผ
- ๊ฐ์ฒด ์ ๋ ฌ
- ๋ฌธ์์ด ๋์๋ฌธ์ ๋ฌด์ ์ ๋ ฌ
- ๋ ์ง ์ ๋ ฌ
- ๋ณตํฉ ๊ธฐ์ค ์ ๋ ฌ
๋ฑ๋ฑ ๋ณต์กํ ๊ฒ๋ค๋ ์ฌ๊ธฐ์ ํด๊ฒฐํ ์ ์๋ค. ๊ฐ์ธ์ ์ธ ์ฒด๊ฐ์ผ๋ก ๋ฌธ์์ด ์ ๋ ฌ, ์ซ์ ์ ๋ ฌ, ๋ ์ง ์ ๋ ฌ์ด ์ ์ผ ๋ง์ด ์ฐ์ด๋๊ฒ ๊ฐ๋ค. ๊ฐ์ฒด ์ ๋ ฌ์ ๋ฌธ์/์ซ์/๋ ์ง ์ ๋ ฌ์ ๋๊ฒจ์ ํฌํจ๋ ๋๋?
(1) ์ซ์ ์ค๋ฆ์ฐจ์
const number = [10, 5, 200, 1, 50]
// a - b๊ฐ ์์๋ฉด (a๊ฐ ์์ผ๋ฉด) a๊ฐ b๋ณด๋ค ์์ ์์น
number.sort((a, b) => a - b)
console.log(number) // [1, 5, 10, 50, 200]
(2) ์ซ์ ๋ด๋ฆผ์ฐจ์
const number = [10, 5, 200, 1, 50]
// b-a๊ฐ ์์๋ฉด (b๊ฐ ์์ผ๋ฉด) b๊ฐ a๋ณด๋ค ์์ ์์น
number.sort((a, b) => b - a)
console.log(number) // [200, 50, 10, 5, 1]
์ด๋ ๊ฒ a - b ์ผ๋ ์ค๋ฆ์ฐจ์์ด๊ณ b - a ๊ฐ ๋ด๋ฆผ์ฐจ์์ธ ์ด์ ๋ sort()๊ฐ "์์ ๊ฐ์ ๋จผ์ ์์ ๋๋ ์ ๋ ฌ"์ ์์น์ผ๋ก ํ๊ณ ์๊ธฐ ๋๋ฌธ์ด๋ค.
์ด๊ฑด ์งํผํฐ์ ๋ณด์ถฉ ์ค๋ช ์ด ํ์ํ๋ค.
โจ ๊ทธ๋ผ ์ a - b = ์ค๋ฆ์ฐจ์์ผ๊น?
a - b๋ฅผ ํ๋ฉด
a๊ฐ ๋ ์์ผ๋ฉด ์์๊ฐ ๋์ค์ง?
์์๊ฐ ๋์ค๋ฉด sort๋ “a, ๋ ์์ค๋ก!”๋ผ๊ณ ํ๋จํด.
๊ทธ๋์ ์์ ๊ฐ์ด ์์ผ๋ก ๋ชจ์ด๋ฉด์ ์ค๋ฆ์ฐจ์์ด ์์ฑ๋ผ.
์์ ํ๋ฆ์ ๊ฐ๊ฐ์ ์ผ๋ก ๋ณด๋ฉด:
- 1 - 10 = ์์ → 1์ด ๋ ์
- 5 - 10 = ์์ → 5๊ฐ ๋ ์
- 200 - 50 = ์์ → 50์ด ๋ ์
์ด๋ฐ ํ๋จ์ ๊ณ์ ๋ฐ๋ณตํ๋ฉด์ ์ ๋ ฌ์ด ๋๋๋ ๊ฑฐ์ผ.
โจ ๋ฐ๋๋ก b - a = ๋ด๋ฆผ์ฐจ์์ธ ์ด์
์ด๋ฒ์ ๋น๊ต ๊ธฐ์ค์ ๋ฐ๋๋ก ๋ค์ง์ด.
b - a๊ฐ ์์๋ผ๋ ๊ฑด
b๊ฐ a๋ณด๋ค ์๋ค๋ ๋ป์ด๊ณ ,
๊ทธ๋์ sort๋ “๊ทธ๋ผ b๊ฐ ๋จผ์ !”๋ผ๊ณ ํ๋จํด.
์ด๋ ๊ฒ ๋๋ฉด ํฐ ์ซ์๊ฐ ์ ์ ์์ผ๋ก ๋ชจ์ฌ์ ๋ด๋ฆผ์ฐจ์์ด ๋ผ.
โจ ํ ์ค ์์ฝ์ผ๋ก ์ ์ผ๋ฉด ์ด๋ ๊ฒ ๋ฐ๊ฟ ์ ์์ด
์ ๋ ฌ์ ๋ฐฉํฅ์ “์์๊ฐ ๋์์ ๋ ๋๊ตฌ๋ฅผ ์์ ๋์ง”๋ก ๊ฒฐ์ ๋๋ค.
a - b๋ “a๊ฐ ์์ผ๋ฉด ์”์ด๋ผ๋ ๊ธฐ์ค์ด์ด์ ์ค๋ฆ์ฐจ์์ด ๋๊ณ ,
b - a๋ ๊ธฐ์ค์ ๋ค์ง์ด์ ๋ด๋ฆผ์ฐจ์์ด ๋๋ค.
์ด๋ ๊ฒ ์ค๋ช ํ๋ฉด ‘์์๋๊น ์์ ๊ฐ๋ค → ๊ทธ๊ฒ ๋๊ตด ๋ปํ์ง?’ ํ๋ฆ์ด ๋งค์ฐ ์์ฐ์ค๋ฝ๊ฒ ์ด์ด์ ธ.
(3) ๋ ์ง ์ ๋ ฌ
const events = [
{ name: 'A', date: '2023-10-15' },
{ name: 'B', date: '2024-01-01' },
{ name: 'C', date: '2023-12-25' }
]
events.sort((a, b) => {
const dateA = new Date(a.date).getTime() // ๋ฐ๋ฆฌ์ด ๋จ์ ์ซ์๋ฅผ ์ป๋ ๋ฉ์๋
const dateB = new Date(b.date).getTime()
return dateB - dateA // ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌ
})
console.log(events)
/* [
{ name: 'B', date: '2024-01-01' }, // ์ต์
{ name: 'C', date: '2023-12-25' },
{ name: 'A', date: '2023-10-15' } // ์ค๋๋จ
]
*/
2. ๋ด๊ฐ ์์ฑํ ์์
์ฐธ๊ณ ๋ก ๋๊ฐ์ ๊ฒฝ์ฐ ๋ ์ง ์ ๋ ฌ์ด๊ธฐ ๋๋ฌธ์ ๋ฌด์กฐ๊ฑด ์ฝ๋ฐฑํจ์์ ์ ๋ฌ์ด ํ์ํ๋ค.
๋๊ธ์ ์์ฑ ์๊ฐ์ ๊ธฐ์ค์ผ๋ก ์ค๋ฆ์ฐจ์/๋ด๋ฆผ์ฐจ์์ ๊ฒฐ์ ํ๋ ๋ก์ง์ ์์ฑํ๋ค.
// cmnts, ascending : ๋ถ๋ชจ๋ก๋ถํฐ ๋ฐ๋ props๊ฐ
// cmnts : ๋๊ธ ๋ชฉ๋ก
// ascending : ์ค๋ฆ, ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌ
const [ascend, setAscend] = useState(ascending ?? true)
const sortCmnts = useMemo(()=> {
return [...cmnts].sort((a, b) => {
const cA = new Date(a.insertDatetime ?? new Date().toISOString())
const cB = new Date(b.insertDatetime ?? new Date().toISOString())
if (ascend) {
// true์ธ ๊ฒฝ์ฐ = ascending
return cA.getTime() - cB.getTime()
} else {
// false์ธ ๊ฒฝ์ฐ = descending
return cB.getTime() - cA.getTime()
}
})
}, [cmnts, ascend])
โuseMemo : ๋น์ฉ์ด ๋ง์ด ๋๋ ํจ์์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํด ๋์๋ค๊ฐ ๋์ผํ ์ ๋ ฅ(์์กด์ฑ ๋ฐฐ์ด)์ด ๋ค์ด์ค๋ฉด ํจ์๋ฅผ ์ฌ์คํํ์ง ์๊ณ ์ ์ฅ๋ ๊ฐ์ ๋ฐํ React Hook.. ์ฌ๊ธฐ์ ์์ค์ํจ
์ฌ๊ธฐ์๋ cA์ cB๋ฅผ ํตํด ๋๊ธ ๋ชฉ๋ก์์ ๋๊ธ ์์ฑ ์๊ฐ(insertDatetime)์ ์์๋ด๊ณ (timpstampz ํ์ ์ด๋ผ ๊ฐ๋ฅํจ), ์ค๋ฆ์ฐจ์์ธ ๊ฒฝ์ฐ a - b, ๋ด๋ฆผ์ฐจ์์ผ ๊ฒฝ์ฐ b - a๋ผ๋ ๊ณต์(?)์ ์ด์ฉํ์ฌ ์์ฑํ์๋ค.
insertDatetime๋ผ๋ ๊ฐ์ผ๋ก๋ถํฐ ๋ฐ๋ฆฌ์ด๊ฐ ํฌํจ๋ ๋ฐ์ดํฐ๋ฅผ ์ถ์ถํ๊ณ (getTime()), ascend๊ฐ true๋ผ๋ฉด(= ์ค๋ฆ์ฐจ์์ด๋ผ๋ฉด) cA.getTime - cB.getTime, false๋ผ๋ฉด(= ๋ด๋ฆผ์ฐจ์์ด๋ผ๋ฉด) cB.getTime() - cA.getTime()์ ํ ๊ฒ์ด๋ค.
[+ ์ฐธ๊ณ ์๋ฃ]
(JS) ๋ฐฐ์ด ์ ๋ ฌ ๋ฉ์๋, sort()
sort()๋ฉ์๋๋ ๋ฐฐ์ด์ ์์๋ฅผ ์ ์ ํ๊ฒ ์ ๋ ฌํ ๋ ์ ์ฉํ๋ค.
velog.io
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/sort
Array.prototype.sort() - JavaScript | MDN
์ ๋ ฌํ ๋ฐฐ์ด. ์ ๋ฐฐ์ด์ด ์ ๋ ฌ๋๋ ๊ฒ์ ์ ์ํ์ธ์. ๋ณต์ฌ๋ณธ์ด ๋ง๋ค์ด์ง๋ ๊ฒ์ด ์๋๋๋ค. compareFunction์ด ์ ๊ณต๋์ง ์์ผ๋ฉด ์์๋ฅผ ๋ฌธ์์ด๋ก ๋ณํํ๊ณ ์ ๋ ์ฝ๋ ์ฝ๋ ํฌ์ธํธ ์์๋ก ๋ฌธ์์ด์ ๋น
developer.mozilla.org

'Frontend๐จ > JavaScript๐, TypeScript๐' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| JavaScript ํ์ดํ ํจ์ ๊ดํธ ์ฌ์ฉ๋ฒ ์ ๋ฆฌ(+์ต๋ช ํจ์) (0) | 2025.11.10 |
|---|---|
| [JavaScript, TypeScript] ์ ์ฌ ๋ฐฐ์ด, ์ดํฐ๋ฌ๋ธ ๊ฐ์ฒด, Array.from() (1) | 2025.09.18 |
| ์ฝ๋ฐฑ ํจ์(callback function) ์ ๋ฆฌํ๊ธฐ (1) | 2025.07.09 |
| [JavaScript, TypeScript] map(), filter(), some()๋ฉ์๋ (0) | 2024.12.21 |
| [JavaScript, TypeScript] ์ต์ ๋ ์ฒด์ด๋(Optional Chaining)์ด๋? (3) | 2024.12.10 |