【发布时间】:2017-10-22 11:33:46
【问题描述】:
我一直为将两个数组合二为一而头疼。
数组的连接就像levels.Id = rooms.level
感谢所有想法!
所以,这是我的 2 个字典数组:
let levels = [
["Name":"Floor 1", "Order":0, "Id": 1],
["Name":"Floor 2", "Order":1, "Id": 2],
["Name":"Outdoor", "Order":2, "Id": 3]]
let rooms = [
["Name":"Master bedroom", "Order":2, "Id": 3, "Level": 2],
["Name":"Guest bedroom", "Order":1, "Id": 4, "Level": 2],
["Name":"Kitchen", "Order":0, "Id": 1, "Level": 1],
["Name":"Boiler", "Order":0, "Id": 2, "Level": 3]]
结果应该是这样的,按两个数组中的“Order”值排序:
["Floor 1" : ["Kitchen"],
"Floor 2" : ["Guest bedroom", "Master bedroom"],
"Outdoor" : ["Boiler"]]
这就是我制作这个数组的方法,但它看起来很丑:
func replaceIdWithName(id : Int)->String {
return rooms.first(where: { $0["Id"] as? Int == id })!["Name"] as! String
}
func getLevelId(id : Int)->String {
return (levels.first(where: { $0["Id"] as? Int == rooms.first(where: { $0["Id"] as? Int == id })?["Level"] as? Int })?["Name"]) as! String
}
var arr : [String : [Any]] = Dictionary(grouping: rooms.map { $0["Id"] as! Int }, by: { getLevelId(id: $0) })
arr.forEach{ arr[$0.0] = $0.1.map { replaceIdWithName(id: $0 as! Int) } }
之前,我已经通过这个函数对两个数组进行了排序:
func sortLevels(p1:[String:Any], p2: [String:Any])->Bool {
let i = p1["Order"] as? Int
let j = p2["Order"] as? Int
if i != nil && j != nil {
return i! < j!
} else {
return false
}
}
【问题讨论】:
-
你试过什么?本网站并非旨在成为“请为我的家庭作业编码”的地方。
-
我已经尝试了数百个选项,但没有一个选项能完全按照我需要的方式工作。我无意为我编写代码。但由于这是我在这里的第一篇文章,我可能会错过我不得不发布我愚蠢的尝试......
标签: arrays swift sorting dictionary filter