Home > Software engineering >  Flatten an array of dictionaries to one dictionary
Flatten an array of dictionaries to one dictionary

Time:04-06

I am having an array of dictionaries with columnId and columnValue as a pair. Now i need to flatten it as columnId as the key and columnValue as the value of it. How is it possible to do with swift higher order functions?

let arrayOfDictionaries = [["columnId": 123, "columnValue": "sample text"], ["columnId": 124, "columnValue": 9977332]]

//The end result should be:   
flattenedDictionary: [String: Any] = ["123": "sample text", "124": 9977332]

Note: Result dictionary will be in the form of [String: Any]

CodePudding user response:

This would work:

func flatten(_ pairs: [[String: Any]]) -> [String: Any] {
    pairs.reduce(into: [String: Any]()) {
        if let id = $1["columnId"] as? Int, let value = $1["columnValue"] {
            $0["\(id)"] = value
        }
    }
}

CodePudding user response:

You can do this in two steps;

  1. Convert your input array into a sequence of key-value pairs using compactMap
  2. Convert the sequence back into a dictionary using Dictionary(uniqueKeysWithValues:)
let arrayOfDictionaries = [["columnId": 123, "columnValue": "sample text"], ["columnId": 124, "columnValue": 9977332]]

let tupleArray:[(String,Any)] = arrayOfDictionaries.compactMap { dict in
    guard let id = dict["columnId"], let value = dict["columnValue"] else {
        return nil
    }
    return ("\(id)",value)
}

let flattenedDictionary: [String: Any] = Dictionary(uniqueKeysWithValues: tupleArray)

Note that this code will throw an exception if there are duplicate keys. You should either take steps to ensure the columnId values are unique or use Dictionary(keysAndValues:, uniquingKeysWith:) to resolve id clashes.

  • Related