如何将两个词典合并到一个词典数组中

时间:2019-05-07 11:15:12

标签: ios swift dictionary

我有一个字典数组,其中有10套字典。在这种情况下,两个字典中的每个字典都是一对,即它们具有一个值相同的特定键。

现在,我需要根据此特定键/ id组合这两个词典。因此,在我的最终输出中,我将得到一个包含5组字典的字典数组(每组2个组合)

在下面的示例集中,您可以看到一对年龄相同的字典,我正在尝试将它们组合为一个。

[ 
 {
   name : John
   age : 26
   eyes : blue
 },
 {
   name : Becky
   age : 26
   eyes : black
 },
 {
   name : Ron
   age : 30
   eyes : brown
 },
 {
   name : Rose
   age : 30
   eyes : yellow
 }
]

[ 
 {
   name1 : John
   name2 : Becky
   age : 26
   eyes1 : blue
   eyes2 : black

 },

 {
   name1 : Ron
   name2 : Rose
   age : 30
   eyes1 : brown
   eyes2 : yellow
 }
]

3 个答案:

答案 0 :(得分:0)

本质上,您想要的是通过某些键(在此示例中为age)对字典进行分组

像这样的事情会做

let persons: [[String: Any]] = [ 
 [
    "name" : "John",
    "age" : 26,
    "eyes" : "blue"
 ],
 [
    "name" : "Becky",
    "age" : 26,
    "eyes" : "black"
 ],
 [
    "name" : "Ron",
    "age" : 30,
    "eyes" : "brown"
 ],
 [
    "name" : "Rose",
    "age" : 30,
    "eyes" : "yellow"
 ]
]

let grouped = Dictionary(grouping: persons, by: { $0["age"] as? Int })

print(grouped)

给你

[Optional(30): [["age": 30, "eyes": "brown", "name": "Ron"], ["age": 30, "eyes": "yellow", "name": "Rose"]], Optional(26): [["eyes": "blue", "age": 26, "name": "John"], ["eyes": "black", "name": "Becky", "age": 26]]]

请注意,如果可以保证所有对象始终具有$0["age"] as! Int值,则可以强制取消包装(Int),以避免对可选int进行分组。

我希望这是有道理的

答案 1 :(得分:0)

您有一个必须转变为疯狂的结构。似乎不太有用,但是如果您确实需要该格式的数据,则可以执行以下操作:

func example(objects: [AnyObject]) -> [[String: Any]] {
    let input = objects as! [[String: Any]]
    return Dictionary.init(grouping: input, by: { $0["age"] as! Int })
        .mapValues {
            $0.map { (obj) -> [String: Any] in
                var out = obj
                out.removeValue(forKey: "age")
                return out
            }
        }
        .map { (each) -> [String: Any] in
            var dict: [String: Any] = ["age": each.key]
            for obj in each.value.enumerated() {
                for c in obj.element {
                    let key = "\(c.key)\(obj.offset + 1)"
                    dict[key] = c.value
                }
            }
            return dict
    }
}

答案 2 :(得分:0)

您可以在要输入的字典上运行for循环,在这种情况下,一个或另一个都不重要

extension Dictionary {
    mutating func append(_ other:Dictionary) {
        // you can do a check here; write a guard checking if the one you're trying to add should be added
        for (key,value) in other {
            self.updateValue(value, forKey:key)
        }
    }

}

使用它附加到要添加到的字典中