[英]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.