Swift: объединить массив словарей с дублирующимся ключом, но уникальными значениями - PullRequest
1 голос
/ 31 января 2020

У меня есть массив словарей, который содержит тот же ключ, но разные значения. Я хочу объединить эти словари и добавить все значения одинаковых ключей, как показано ниже:

var arrayofDict = [["2019":"A"],["2019":"B"],["2019":"C"],["2018":"A"],["2018":"c"],["2017":"A"],["2017":"B"],["2017":"C"],["2016":"A"],["2015":"A"],["2015":"B"]]

ожидаемый результат в виде словаря:

   var newDict = [["2019":["A","B","C"]],["2018":["A","C"]],["2017":["A","B","C"]],["2016":["A"]],["2015":["A","B"]]]

Ответы [ 2 ]

3 голосов
/ 31 января 2020

Это показывает, как создать один словарь. Ваш "ожидаемый результат" является массивом. Это то, что вы действительно ожидали, или вам нужен массив?

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

var arrayofDict = [["2019":"A"],["2019":"B"],["2019":"C"],["2018":"A"],["2018":"c"],["2017":"A"],["2017":"B"],["2017":"C"],["2016":"A"],["2015":"A"],["2015":"B"]]

var result = [String : [String]]()
for dict in arrayofDict {
    for (key, value) in dict {
        result[key, default: []].append(value)
    }
}

print(result)
["2016": ["A"], "2018": ["A", "c"], "2015": ["A", "B"], "2019": ["A", "B", "C"], "2017": ["A", "B", "C"]]

Или, если вам нужен массив:

let result2 = result.map { [$0.key: $0.value] }
print(result2)
[["2015": ["A", "B"]], ["2016": ["A"]], ["2019": ["A", "B", "C"]], ["2018": ["A", "c"]], ["2017": ["A", "B", "C"]]]
0 голосов
/ 01 февраля 2020

как @vacawama более функционально

let result = arrayofDict.reduce(into: [String:[String]]()) { (acc, d) in
    for key in d.keys {
        // don't worry to force unwrap d[key], if key exist, the value is not nil
        acc[key, default: []].append(d[key]!)
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...