Search code examples
iosswiftdictionaryswift5

Swift: Merge Array of dictionaries with duplicate key but unique values


I have a array of dictionaries which contains same key but different values. I want to merge these dictionaries and add all the values of same keys just like below:

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

expected result as an Array like:

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

Solution

  • This shows how to build a single dictionary. Your "expected result" is an array. Is this what you really expected or did you want an array?

    You can iterate the dictionary items and build up the dictionary entries:

    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"]]
    

    Or, if you want an array:

    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"]]]