我有一个字典数组,其中有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
}
]
答案 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)
}
}
}
使用它附加到要添加到的字典中