Released 2023-06-12

Modified 2023-06-12

Tech

1255Words (7min read)

雙層陣列排序與 localeCompare

Title Image

Photo by Adi Goldstein on Unsplash

前言 - Prologue

在現代軟體開發中,雙層陣列排序是一個常見而具有挑戰性的任務。

本文深入探討了雙層陣列排序的概念和技巧,並介紹了如何使用 JavaScript 的 localeCompare 函式實現多語言排序。

透過學習這些知識和技巧將能夠處理複雜的排序需求,確保在不同語言環境中獲得準確且一致的排序結果。

正文 - Main text

在開始討論雙層陣列的排序方法之前,讓我們先來了解一下雙層陣列的結構和排序需求。

雙層排序的基本概念

雙層陣列是一種包含多個子陣列的結構,每個子陣列可能包含不同數量的元素。我們需要根據特定的排序準則,對這些子陣列進行排序,同時保持子陣列內元素的相對順序,而這就叫雙層排序。

雙層排序是一種對資料進行兩次排序的方法。它可以在排序過程中考慮多個屬性,以獲得更精確的排序結果。

首先,先根據一個屬性進行排序,如果該屬性的值相同,則再根據另一個屬性進行排序。

這種排序方式在處理需要考慮多個條件的排序需求時非常有用。

以下為雙層陣列示例:

const data = [
  { name: 'Alice', age: 20 },
  { name: 'Bob', age: 25 },
  { name: 'Charlie', age: 20 },
  { name: 'David', age: 18 },
];

期望結果:根據 age 屬性進行排序,如果 age 屬性相同,再根據 name 屬性進行排序。

使用 localeCompare 函式進行排序

JavaScript 的 String 物件提供了一個名為 localeCompare() 的函式,用於比較字串並根據特定語言的排序規則返回比較結果。我們可以利用這個函式來實現雙層排序。

使用以下的排序函式來進行雙層排序:

data.sort((a, b) => {
  if (a.age !== b.age) {
    return a.age - b.age; // 先根據 age 屬性進行排序
  } else {
    return a.name.localeCompare(b.name); // 如果 age 屬性相同,則根據 name 屬性進行排序
  }
});

在這個排序函式中,首先檢查兩個物件的 age 屬性是否相同。如果不相同,將根據 age 屬性的值進行排序。如果 age 屬性相同,則使用 localeCompare 函式對 name 屬性進行排序。這樣就能獲得根據多個屬性進行排序的結果。

最終排序的結果如下:

[
  { name: 'David', age: 18 },
  { name: 'Alice', age: 20 },
  { name: 'Charlie', age: 20 },
  { name: 'Bob', age: 25 }
]

完整示例:(輸出可以至 CodePen 內的 console 查看輸出結果)

處理不同語言環境下的排序

在多語言環境中,使用正確的語言排序規則是非常重要的。localeCompare() 函式可以接受一個可選的參數,用於指定排序時要使用的語言環境。

例如:如果想根據德語的排序規則對雙層陣列進行排序,可以將 "de" 作為 localeCompare 函式的參數:

data.sort((a, b) => a.name.localeCompare(b.name, 'de'));

這樣可以確保排序結果符合德語的排序規則。藉由調整這個參數,我們能夠根據具體的語言需求來定制排序的行為。

處理其他排序問題的技巧

在實現雙層陣列排序時,還可能遇到一些其他的問題,例如處理大小寫不敏感的排序、處理包含特殊字符的排序等。

若要在排序過程中忽略大小寫,我們可以在使用 localeCompare() 函式時,將選項設定為 "en" 並添加 sensitivity: 'base'

data.sort((a, b) => a.name.localeCompare(b.name, 'en', { sensitivity: 'base' }));

這樣可以確保排序結果在比較時忽略大小寫。

若要處理包含特殊字符的排序,我們可以使用 Unicode Collation Algorithm (UCA) 來處理。

UCA 是一個定義了全球通用排序規則的算法。在 JavaScript 中可以使用 Intl.Collator 類別來實現 UCA 排序:

const collator = new Intl.Collator('en', { sensitivity: 'base' });
arr.sort((a, b) => collator.compare(a[0], b[0]));

這樣可以根據 UCA 排序規則對子陣列進行排序。

後記 - Epilogue

雙層排序是一種常見且具有挑戰性的排序方法,可以根據多個屬性進行排序,以獲得精確的排序結果。

在 JavaScript 中,我們可以使用 localeCompare() 函式以及其他技巧來實現雙層排序,包括處理不同語言環境下的排序和處理其他排序問題。這些知識和技巧將幫助我們在開發中處理複雜的排序需求,並實現準確且一致的排序結果。

下一篇文章沒有意外就是詳細介紹一下什麼是 localeCompare() 函式啦!

Read more from Tech
lightbox-image
Toggle Button - Red Pandas Icons by svgrepo.com

Copyrights © 2023 Kama, All Rights Reserved.