按某个键值对字典数组进行排序(Swift 3)

时间:2017-05-17 15:53:18

标签: arrays swift sorting dictionary

我一直在寻找一种方法来根据发票ID(这是字典中某个键的值)对发票字典数组进行排序。我找不到一个和我一样喜欢的解决方案,所以我写了一个适合我的功能,我想我会与社区分享。

非常简单,只需传入数组,传入密钥进行排序,然后返回排序的数组。

let testArray: Array<Dictionary<String, String>> = sortDictArrayByKey(arr: someUnsortedArray, key: keyToSort)
func sortDictArrayByKey(arr: Array<Dictionary<String, String>>, key: String) -> Array<Dictionary<String, String>>{
    var keyArray = Array<String>()
    var usedKeys = Array<String>()
    for object in arr{
        keyArray.append(object[key]!)
    }

    keyArray.sort(by: <)

    var newArray = Array<Dictionary<String, String>>()
    for keyVal in keyArray{

    // Check if we've already seen this entry, if so, skip it
        if usedKeys.contains(keyVal){
            continue
        }
        usedKeys.append(keyVal)

    // Check for duplicate entries
        var tempArray = Array<Dictionary<String, String>>()
        for object in arr{
            if object[key] == keyVal{
                tempArray.append(object)
            }
        }
        for item in tempArray{
            newArray.append(item)
        }
        tempArray.removeAll()
    }
    return newArray
}

1 个答案:

答案 0 :(得分:2)

扩展

您可以为Arrays Dictionaries KeyValue String(s)创建一个可用的扩展程序。

extension Array where Element == [String:String] {
    func sorted(by key: String) -> [[String:String]] {
        return sorted { $0[key] ?? "" < $1[key] ?? "" }
    }
}

实施例

let crew = [
    ["Name":"Spook"],
    ["Name":"McCoy"],
    ["Name":"Kirk"]
]

crew.sorted(by: "Name")

// [["Name": "Kirk"], ["Name": "McCoy"], ["Name": "Spook"]]