【问题标题】:Convert array to dictionary in Swift在 Swift 中将数组转换为字典
【发布时间】:2021-01-19 13:46:26
【问题描述】:

我无法想出将数组转换为字典的算法。 该数组具有以下结构:

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 是一个简单的结构。 输出应该是字典。在上面给出的示例中,这应该如下所示:

[
    "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”参数的情况?

【问题讨论】:

  • 因为数组可以是无序的.. 不,它不能,数组是有序的但是字典是无序的。
  • 我的意思是我不能确定一个参数是在它的父参数之前还是之后添加的。这需要某种排序。

标签: ios arrays swift algorithm dictionary


【解决方案1】:

为了解决这个问题,我们需要使用递归来连接父对象和子对象。这是一个具有一个普通函数的解决方案,它遍历顶级父级(即没有父级的对象),然后为任何类型为“数组”的父级调用递归函数,即可能有子级的父级。

//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": false], ["name3.2": [["name4.1": "baz"]]]], "name2": true, "name1 ": "条"]

【讨论】:

  • 非常感谢。我知道我需要某种递归,但无法提出正确的解决方案。
猜你喜欢
  • 2018-11-22
  • 2021-10-18
  • 1970-01-01
  • 2017-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-15
  • 2018-01-08
相关资源
最近更新 更多