[JS] localeCompare

์„ ์šฐยท2025๋…„ 5์›” 27์ผ
post-thumbnail

๐Ÿ” localeCompare() ๋ž€?

๐Ÿ’ก ๋ฌธ์ž์—ด์„ ๋น„๊ตํ•ด์„œ ์ •๋ ฌ ๊ธฐ์ค€์„ ์ •ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”์„œ๋“œ์ด๋‹ค.
ํŠนํžˆ, ๋‹ค๊ตญ์–ด ํ™˜๊ฒฝ์ด๋‚˜ ์‚ฌ์ „์ˆœ ์ •๋ ฌ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๋งค์šฐ ์œ ์šฉํ•˜๋‹ค.

โœจ localeCompare() ๋ฉ”์„œ๋“œ ํŒŒํ—ค์น˜๊ธฐ

  • ์‚ฌ์šฉ ๋ฌธ๋ฒ•
referenceString.localeCompare(compareString, [locales], [options])
  • localeCompare() ๋ฉ”์„œ๋“œ๋Š” ๋‘ ๊ฐœ์˜ ๋ฌธ์ž์—ด์„ ๋น„๊ตํ•˜์—ฌ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์„ธ ๊ฐ€์ง€ ๊ฐ’ ์ค‘ ํ•˜๋‚˜๋ฅผ ๋ฐ˜ํ™˜ํ•จ

    ๋ฐ˜ํ™˜๊ฐ’์˜๋ฏธ
    ์Œ์ˆ˜์ฐธ์กฐ ๋ฌธ์ž์—ด(๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ ๋ฌธ์ž์—ด)์ด ๋น„๊ต ๋ฌธ์ž์—ด๋ณด๋‹ค ์•ž์— ์˜ฌ ๊ฒฝ์šฐ
    0๋‘ ๋ฌธ์ž์—ด์ด ๋™์ผํ•œ ๊ฒฝ์šฐ
    ์–‘์ˆ˜์ฐธ์กฐ ๋ฌธ์ž์—ด์ด ๋น„๊ต ๋ฌธ์ž์—ด๋ณด๋‹ค ๋’ค์— ์˜ฌ ๊ฒฝ์šฐ
  • referenceString

    • ๋น„๊ต ๊ธฐ์ค€์ด ๋˜๋Š” ๋ฌธ์ž์—ด(๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ฌธ์ž์—ด)
  • compareString

    • referenceString๊ณผ ๋น„๊ตํ•  ๋ฌธ์ž์—ด
  • locales(์„ ํƒ ์‚ฌํ•ญ)

    • ๋ฌธ์ž์—ด ๋น„๊ต์— ์‚ฌ์šฉํ•  locale(์–ธ์–ด ๋ฐ ๊ตญ๊ฐ€)์„ ์ง€์ •, ๋ฐฐ์—ด๋กœ ์—ฌ๋Ÿฌ locale์„ ์ง€์ •ํ•  ์ˆ˜๋„ ์žˆ์Œ
      • ์˜ˆ: 'en-US', 'ko-KR', ['en-US', 'ko-KR']
  • options(์„ ํƒ ์‚ฌํ•ญ)

    • ๋น„๊ต ๋™์ž‘์„ ์‚ฌ์šฉ์ž ์ •์˜ํ•  ์ˆ˜ ์žˆ๋Š” ์†์„ฑ๋“ค์„ ํฌํ•จํ•˜๋Š” ๊ฐ์ฒด

      ์˜ต์…˜๋ช…์„ค๋ช…
      sensitivity๋ฌธ์ž์—ด ๋น„๊ต์˜ ๋ฏผ๊ฐ๋„๋ฅผ ์„ค์ •
      numeric์ˆซ์ž ๋ฌธ์ž์—ด์„ ์ˆซ์ž์ฒ˜๋Ÿผ ๋น„๊ตํ• ์ง€ ์—ฌ๋ถ€๋ฅผ ์„ค์ •
      caseFirst๋Œ€์†Œ๋ฌธ์ž ์ •๋ ฌ ์šฐ์„ ์ˆœ์œ„ ์„ค์ •
      • sensitivity

        ๊ฐ’๋น„๊ต ๋ฐฉ์‹์˜ˆ์‹œ
        'base'๊ธฐ๋ณธ ๊ธ€์ž๋งŒ ๋น„๊ตํ•จ'a' === 'A'
        'accent'๊ธฐ๋ณธ ๊ธ€์ž์™€ ์•…์„ผํŠธ ๋งˆํฌ๊นŒ์ง€ ๋น„๊ตํ•จ'a' !== 'รก'
        'case'๊ธฐ๋ณธ ๊ธ€์ž์™€ ๋Œ€์†Œ๋ฌธ์ž๊นŒ์ง€ ๋น„๊ตํ•จ'a' !== 'A'
        'variant'๋ชจ๋“  ์ฐจ์ด์ ์„ ๋น„๊ตํ•จ(๊ฐ€์žฅ ์—„๊ฒฉ)
      • numeric

        ๊ฐ’๋น„๊ต ๋ฐฉ์‹
        true์ˆซ์ž ๋ฌธ์ž์—ด์„ ์ˆซ์ž์ฒ˜๋Ÿผ ๋น„๊ตํ•จ
        false์ˆซ์ž ๋ฌธ์ž์—ด์„ ์ˆซ์ž์ฒ˜๋Ÿผ ๋น„๊ตํ•˜์ง€ ์•Š์Œ
      • caseFirst

        ๊ฐ’๋น„๊ต ๋ฐฉ์‹
        'upper'๋Œ€๋ฌธ์ž๊ฐ€ ์†Œ๋ฌธ์ž๋ณด๋‹ค ๋จผ์ € ์˜ด
        'lower'์†Œ๋ฌธ์ž๊ฐ€ ๋Œ€๋ฌธ์ž๋ณด๋‹ค ๋จผ์ € ์˜ด
        'false'locale ๊ธฐ๋ณธ๊ฐ’์— ๋”ฐ๋ฆ„

โœ… ํ™œ์šฉ ์˜ˆ์‹œ

1. ๊ฐ„๋‹จํ•œ ๋ฌธ์ž์—ด ๋น„๊ต(ํ•œ๊ธ€)

const str1 = '๊ฐ€๋‚˜๋‹ค';
const str2 = '๋‚˜๋‹ค๋ผ';
const str3 = '๊ฐ€๋‚˜๋‹ค';
const str4 = '๊ฐ€๊ฐ€๋‹ค';

console.log(str1.localeCompare(str2, 'ko-KR')); // ์Œ์ˆ˜ ('๊ฐ€๋‚˜๋‹ค'๊ฐ€ '๋‚˜๋‹ค๋ผ'๋ณด๋‹ค ์•ž์— ์˜ด)
console.log(str2.localeCompare(str1, 'ko-KR')); // ์–‘์ˆ˜ ('๋‚˜๋‹ค๋ผ'๊ฐ€ '๊ฐ€๋‚˜๋‹ค'๋ณด๋‹ค ๋’ค์— ์˜ด)
console.log(str1.localeCompare(str3, 'ko-KR')); // 0 (๋‘ ๋ฌธ์ž์—ด์ด ๊ฐ™์Œ)
console.log(str1.localeCompare(str4, 'ko-KR')); // ์–‘์ˆ˜ ('๊ฐ€๋‚˜๋‹ค'๊ฐ€ '๊ฐ€๊ฐ€๋‹ค'๋ณด๋‹ค ๋’ค์— ์˜ด)

2. ๋ฐฐ์—ด ์ •๋ ฌ

const fruits = ['๋ฐ”๋‚˜๋‚˜', '์‚ฌ๊ณผ', '์• ํ”Œ', 'Banana', 'apple', 'Orange', '์˜ค๋ Œ์ง€'];

// ๊ธฐ๋ณธ sort() (์œ ๋‹ˆ์ฝ”๋“œ ๊ฐ’ ๊ธฐ์ค€)
console.log('๊ธฐ๋ณธ sort():', fruits.sort());
// ๊ฒฐ๊ณผ๋Š” ์˜ˆ์ƒ๊ณผ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (์˜ˆ: 'Apple' ๋‹ค์Œ์— 'Banana'๊ฐ€ ์˜ค๊ณ , ํ•œ๊ธ€๊ณผ ์˜์–ด๊ฐ€ ์„ž์ผ ์ˆ˜ ์žˆ์Œ)
// [ 'Apple', 'Banana', 'Orange', 'apple', '๋ฐ”๋‚˜๋‚˜', '์‚ฌ๊ณผ', '์• ํ”Œ', '์˜ค๋ Œ์ง€' ] ์™€ ๋น„์Šทํ•˜๊ฒŒ ๋‚˜์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (์ •ํ™•ํ•œ ์ˆœ์„œ๋Š” ํ™˜๊ฒฝ๋งˆ๋‹ค ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Œ)

// localeCompare()๋ฅผ ์ด์šฉํ•œ ํ•œ๊ธ€, ์˜์–ด ํ˜ผํ•ฉ ์ •๋ ฌ (ํ•œ๊ตญ์–ด ๋กœ์ผ€์ผ)
fruits.sort((a, b) => a.localeCompare(b, 'ko-KR', { sensitivity: 'base' }));
console.log('localeCompare() ์ •๋ ฌ (ko-KR):', fruits);
// ์˜ˆ์ƒ ๊ฒฐ๊ณผ: [ '๋ฐ”๋‚˜๋‚˜', '์‚ฌ๊ณผ', '์• ํ”Œ', '์˜ค๋ Œ์ง€', 'apple', 'Banana', 'Orange' ] (ํ•œ๊ธ€์ด ๋จผ์ €, ๊ทธ ๋‹ค์Œ ์˜์–ด๊ฐ€ ์‚ฌ์ „์ˆœ์œผ๋กœ ์ •๋ ฌ๋  ํ™•๋ฅ ์ด ๋†’์Œ)

// ์˜์–ด ๋กœ์ผ€์ผ๋กœ ์ •๋ ฌ (๋Œ€์†Œ๋ฌธ์ž ๊ตฌ๋ถ„ ์—†์ด)
fruits.sort((a, b) => a.localeCompare(b, 'en-US', { sensitivity: 'base' }));
console.log('localeCompare() ์ •๋ ฌ (en-US, base):', fruits);
// ์˜ˆ์ƒ ๊ฒฐ๊ณผ: [ 'apple', 'Apple', 'Banana', 'Orange', ... ] (๋Œ€์†Œ๋ฌธ์ž ๊ตฌ๋ถ„ ์—†์ด ์•ŒํŒŒ๋ฒณ ์ˆœ)

// ์˜์–ด ๋กœ์ผ€์ผ๋กœ ์ •๋ ฌ (๋Œ€์†Œ๋ฌธ์ž ๊ตฌ๋ถ„)
fruits.sort((a, b) => a.localeCompare(b, 'en-US', { sensitivity: 'case' }));
console.log('localeCompare() ์ •๋ ฌ (en-US, case):', fruits);
// ์˜ˆ์ƒ ๊ฒฐ๊ณผ: [ 'Apple', 'apple', 'Banana', 'Orange', ... ] (๋Œ€๋ฌธ์ž๊ฐ€ ์†Œ๋ฌธ์ž๋ณด๋‹ค ๋จผ์ €)

3. ์ˆซ์ž ๋ฌธ์ž์—ด ์ •๋ ฌ

numerice ์˜ต์…˜์„ ์‚ฌ์šฉํ•ด์„œ ๋ฌธ์ž์—ด ํ˜•ํƒœ์˜ ์ˆซ์ž๋„ ์ •๋ ฌ ๊ฐ€๋Šฅํ•จ

const versions = ['v10', 'v2', 'v1'];

versions.sort((a, b) => a.localeCompare(b, undefined, { numeric: true }));
console.log('์ˆซ์ž ๋ฌธ์ž์—ด ์ •๋ ฌ:', versions);
// ์˜ˆ์ƒ ๊ฒฐ๊ณผ: [ 'v1', 'v2', 'v10' ]

๐Ÿ“ ์ •๋ฆฌ

  • localeCompare()๋Š” ๋‹ค๊ตญ์–ด ๋ฌธ์ž์—ด ์ •๋ ฌ์—์„œ ํ•„์ˆ˜์ ์ธ ๋„๊ตฌ์ด๋‹ค.
  • ์ˆซ์ž ์ •๋ ฌ, ๋Œ€์†Œ๋ฌธ์ž ์šฐ์„ ์ˆœ์œ„, ์•…์„ผํŠธ ๊ตฌ๋ถ„ ๋“ฑ ์ •๊ตํ•œ ์ •๋ ฌ ๊ธฐ์ค€์ด ํ•„์š”ํ•  ๋•Œ ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ์„ ๋ฐœํœ˜ํ•œ๋‹ค.
  • ๋‹จ์ˆœ sort()๋กœ๋Š” ํ•ด๊ฒฐ๋˜์ง€ ์•Š๋Š” ์ •๋ ฌ ๋ฌธ์ œ์— ์œ ์šฉํ•˜๋‹ค.

0๊ฐœ์˜ ๋Œ“๊ธ€