Как я могу сгруппировать массив со словарями, используя значение ключа. - PullRequest
0 голосов
/ 24 октября 2018

Я работаю с 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 голосов
/ 25 октября 2018

Вы можете использовать массив из исходной строки 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\"}"]]
0 голосов
/ 25 октября 2018

Вы можете определить словарь со всеми уведомлениями:

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
    }
}

(Обратите внимание на использование ключей кодирования для соответствиябыстрый способ именования свойств)

Затем вы можете декодировать 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)
}
0 голосов
/ 24 октября 2018

Создайте пустой словарь типа [String: [Item]].

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

Переберите все элементы в исходном массиве и сделайте следующее.Если нет ключа с данным именем, создайте пустой массив и добавьте элемент, иначе добавьте элемент в существующий массив.

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

Вызовите dict["Today"], и вы получите массив элементов свремя = "Сегодня".


Swift 4

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