skip to Main Content

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]

2

Answers


  1. 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.

    Login or Signup to reply.
  2. 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
            }
        }
    }
    
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search