使用 Dictionary Key 為 Dictionary 做排序
撰寫 APP 無可避免常要跟 JSON 的資料格式打交道,因 JSON 的格式與 Dictionary 的格式是一致的,所以一般狀況下都是使用 Dictionary 來接收 JSON 的資料,但是呢。Dictionary 的 key 是無序的
,所謂無序就是每一次取出的順序都會是不一樣的,很顯然這並不是我們要的結果,所以我們得必須對它做排序的處理,如此才能將資料正確的呈現在畫面上,而法蘭克今天就要來介紹兩種處理 Dictionary 排序的方法。
方式一
利用 LazyMapCollection 的函式,結果為回傳一個已排序好的 key 陣列。
public func sorted(by areInIncreasingOrder: (Element, Element) -> Bool) -> [Element]
areInIncreasingOrder 這個 closure 可用 「<」 或「 >」來表示「由小排到大」或「由大排到小」。
方式二
利用 Dictionary 自有的函式,結果為回傳一個已排序好的 Dictionary 陣列。
public func sorted(by areInIncreasingOrder: ((key: Key, value: Value), (key: Key, value: Value)) -> Bool) -> [(key: Key, value: Value)]
第 10 行 => 該閉包所捕獲的兩個參數(firstDictionary, secondDictionary)為 Tuple,可以把它想像成 Dictionary 中的 Dictionary。
第 11 行 => 透過 .0 來取出第 1 和 第 2 個 Tuple 的 key 值出來做比較。「<」表示「由小排到大」,「>」表示「由大排到小」。
第 14 行 => 結果為一 Dictionary 陣列。
不過有時侯天不從人願,後端人員把 Dictionary 的 key 值定義為 Item1、Item2、Item3 … Item10,如果再使用原本的方法做排序,很遺憾的結果並不是我們想要的。
結果為:Item1、Item10、Item2 … Item9。
那我們該怎麼辦呢?其實不難,我們可以取出 Item 之後的字串再轉成 Int 後來做比較即可,用以上的兩種方式再加以修改一下寫法即可。
- 方式一
第 13~14 行 => 將 Item 字串後的值取出後並轉成 Int。
結果為: [“Item1”, “Item2”, “Item3”, “Item4”, “Item5”, “Item6”, “Item7”, “Item8”, “Item9”, “Item10”]。
- 方式二
第 13 行 => 取出 Tuple 的第 0 個 index 值的資料,也就是 Dictionary Key。
結果為:[(key: “Item1”, value: “One”), (key: “Item2”, value: “Two”), (key: “Item3”, value: “Three”), (key: “Item4”, value: “Four”), (key: “Item5”, value: “Five”), (key: “Item6”, value: “Siv”), (key: “Item7”, value: “Seven”), (key: “Item8”, value: “Eight”), (key: “Item9”, value: “Nine”), (key: “Item10”, value: “Ten”)]。