Frontend๐ŸŽจ/JavaScript๐Ÿ’›, TypeScript๐Ÿ’™

sort()์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ธฐ

JanuDev 2025. 12. 3. 13:35

์งค ๋ณด๊ณ  ๋นก๋นก ์›ƒ์Œ

์ƒ๊ฐ๋ณด๋‹ค 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()์„ ํ•œ ๊ฒƒ์ด๋‹ค.

 

[+ ์ฐธ๊ณ  ์ž๋ฃŒ]

https://velog.io/@yunsungyang-omc/JS-%EB%B0%B0%EC%97%B4-%EC%A0%95%EB%A0%AC-%EB%A9%94%EC%86%8C%EB%93%9C-sort

 

(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