如何使用Key值将带有字典的数组分组。

时间:2018-10-24 20:20:03

标签: ios arrays swift swift3 nsdictionary

我正在与Json合作,后者的响应类似这样

{"Type": "ABCDEF", "user_photo": "c16a8ad9bf08f966.jpg", "time": 1540399975658}

因此我通过使用自定义函数将此转换为以下格式,以便可以看到Today, Yesterday, last week, Last month等的值。

{"Type": "ABCDEF", "user_photo": "c16a8ad9bf08f966.jpg", "time": "Today"}

现在,我正在尝试使用此结构在不同部分中的表格视图上显示此内容,每个部分显示特定时间的项目。

今天的所有项目都将在一个区域中。昨天的所有项目都将放在一个区域中,依此类推。

我有所有这些响应的数组,并且我试图将它们分组为字典,每个键值具有相同的time键。如果我能解决这个问题,我想在部分中使用它们会很容易

This is what I am trying to achieve.

我陷入了困境,不确定如何继续下去。

我尝试但失败的1个解决方案是拥有一系列Times和匹配的响应数组。尝试对Times数组进行分组,但是没有用。

3 个答案:

答案 0 :(得分:1)

创建一个类型为[String:[Item]]的空字典。

var dict = [String: [Item]]()

遍历原始数组中的所有项目,然后做下一件事。如果没有给定名称的键,请创建一个空数组并追加一个项目,否则在现有数组中添加项目。

for item in items {
    dict[item.time, default: []].append(item)
}

致电dict["Today"],您将获得一系列带有time =“ Today”的项目。


快捷键4

Dictionary(grouping: items, by: { $0.time })

答案 1 :(得分:1)

您可以使用原始JSON字符串中的数组,然后以自己的方式对其进行解析。

因此,您将分组问题与分析问题分开了。

如以下代码所示,并在操场上尝试。

    let array = ["{\"Type\": \"ABCDEF\", \"user_photo\": \"c16a8ad9bf08f966.jpg\", \"time\": \"last week\"}", "{\"Type\": \"ABCDEF\", \"user_photo\": \"c16a8ad9bf08f966.jpg\", \"time\": \"Tomorrow\"}" , "{\"Type\": \"ABCDEF\", \"user_photo\": \"c16a8ad9bf08f966.jpg\", \"time\": \"Today\"}","{\"Type\": \"ABCDEF\", \"user_photo\": \"c16a8ad9bf08f966.jpg\", \"time\": \"Today\"}"]
    let re = try  NSRegularExpression.init(pattern: "(\\\"([^\"])*\\\")[\\s}]+$", options:  [.anchorsMatchLines ,. allowCommentsAndWhitespace])
    let dict =  Dictionary.init(grouping: array) {
            return ($0 as NSString).substring(with: re.matches(in: $0, options: [], range: NSRange.init(location: 0, length: $0.count))[0].range(at: 1))
    }
    print(dict)

结果是:

 ["\"last week \"": ["{\"Type\": \"ABCDEF\", \"user_photo\": \"c16a8ad9bf08f966.jpg\", \"time\": \"last week \"  }"], "\"Tomorrow\"": ["{\"Type\": \"ABCDEF\", \"user_photo\": \"c16a8ad9bf08f966.jpg\", \"time\": \"Tomorrow\"}"], "\"Today\"": ["{\"Type\": \"ABCDEF\", \"user_photo\": \"c16a8ad9bf08f966.jpg\", \"time\": \"Today\"}", "{\"Type\": \"ABCDEF\", \"user_photo\": \"c16a8ad9bf08f966.jpg\", \"time\": \"Today\"}"]]

答案 2 :(得分:0)

您可以定义一个包含所有通知的字典:

var notifcationsDict: [String: [Notification]] = ["Today": [],
                                                  "Yesterday": [],
                                                  "Last week": [],
                                                  "Last month": [],]

定义通知结构:

struct Notification: Decodable {
    let type, userPhoto, time: String

    enum CodingKeys: String, CodingKey {
        case type = "Type"
        case userPhoto = "user_photo"
        case time
    }
}

(请注意使用编码键来遵循Swift的命名属性方式)

然后您可以解码json并将通知附加到字典中的相应键:

let json = """
{
    "Type": "ABCDEF",
    "user_photo": "c16a8ad9bf08f966.jpg",
    "time": "Today"
}
"""

guard let jsonData = json.data(using: .utf8) else {
    fatalError("Couldn't get the json to data")
}

do {
    let notification = try JSONDecoder().decode(Notification.self, from: jsonData)
    notifcationsDict[notification.time]?.append(notification)
    print(notifcationsDict)
} catch {
    print(error)
}