簡體   English   中英

在 Swift 中將數組轉換為字典

[英]Convert array to dictionary in Swift

我無法想出將數組轉換為字典的算法。 該數組具有以下結構:

let array = [
    Parameter(type: "string", name: "name1", value: "bar", parent: nil),
    Parameter(type: "bool", name: "name2", value: true, parent: nil),
    Parameter(type: "array", name: "name3", value: [], parent: nil),
    Parameter(type: "bool", name: "name3.1", value: false, parent: "name3"),
    Parameter(type: "array", name: "name3.2", value: [], parent: "name3"),
    Parameter(type: "string", name: "name4.1", value: "baz", parent: "name3.2")
]

Parameter是一個簡單的結構。 Output 應該是字典。 在上面給出的示例中,這應該如下所示:

[
    "name1": "bar",
    "name2": true,
    "name3": [
        "name3.1": false,
        "name3.2": [
            "name4.1": "baz"
        ]
    ]
]

在給定結構沒有父結構的情況下,實現它是非常基本的,但我在實現另一種情況時遇到了麻煩:

func makeDictionary(from array: [Parameter]) -> [String: Any] {
    var dictionary: [String: Any] = [:]
    for parameter in array {
        if let parent = parameter.parent {
            #warning("how to handle this case?")
        } else {
            dictionary[parameter.name] = parameter.value
        }
    }
    return dictionary
}

由於數組可能是無序的,我將如何處理在數組“name3.2”或數組“name3”創建並在我的字典中可用之前接收“name4.1”參數的情況?

為了解決這個問題,我們需要使用遞歸來連接父對象和子對象。 這是一個使用普通 function 的解決方案,它迭代頂級父級(即沒有父級的對象),然后為“數組”類型的任何父級調用遞歸 function,即可能有孩子的父級。

//Main function
func makeDictionary(from array: [Parameter]) -> [String: Any] {
    let parents = array.filter { $0.parent == nil }
    var dictionary = [String: Any]()

    for parent in parents {
        if parent.type == "array" {
            let child = allChildren(for: array.filter { $0.parent == parent.name }, in: array)
            dictionary[parent.name] = child
        } else {
            dictionary[parent.name] = parent.value
        }
    }
    return dictionary
}

//Recursive function
func allChildren(for children: [Parameter], in array: [Parameter]) -> [[String: Any]] {
    var result = [[String: Any]]()

    for child in children {
        if child.type == "array" {
            let children = allChildren(for: array.filter { $0.parent == child.name }, in: array)
            result.append([child.name: children])
        } else {
            result.append([child.name: child.value])
        }
    }
    return result
}

例子

let dictionary = makeDictionary(from: array)
print(dictionary)

[“name3”:[[“name3.1”:假],[“name3.2”:[[“name4.1”:“baz”]]]],“name2”:真,“name1”:“酒吧”]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM