代码之家  ›  专栏  ›  技术社区  ›  J. Doe

更改字典中键的类型

  •  1
  • J. Doe  · 技术社区  · 6 年前

    {
      "test":{
        "0":{
          "test":"test"
        }
      }
    }
    

    JSON中的键只能是字符串,因此在检索此JSON时,我得到以下声明:

    let myJson = [String: [String: Any]]()
    

    let myJson2 = [Int: [String: Any]]()
    

    我该怎么办 compactMap filter myJson myJson2 Int 键并复制值?我知道了:

    var myJson2 = [Int: [String: Any]]()
    
    for (key, value) in myJson {
        guard let keyInt = Int(key) else { return }
        myJson2[keyInt] = value
    }
    

    但我正在寻找一个解决方案与紧凑的地图,可以做它在一行

    1 回复  |  直到 6 年前
        1
  •  4
  •   Martin R    6 年前

    你可以用 compactMap 关于原语的键/值对序列 字典来提取那些带有整数键的,以及 Dictionary(uniqueKeysWithValues:) 创建新词典:

    let myDict: [String: [String: Any]] = [
        "test": [ "0": [ "test" : "test" ]],
        "123": [ "1" :[ "foo": "bar" ] ]
    ]
    
    let myDict2 = Dictionary(uniqueKeysWithValues: myDict.compactMap { (key, value) in
        Int(key).map { ($0, value) }
    })
    
    print(myDict2) // [123: ["1": ["foo": "bar"]]]
    print(type(of: myDict2)) // Dictionary<Int, Dictionary<String, Any>>
    

    不同的 整数。如果那样的话 不保证那么用

    let myDict2 = Dictionary(myDict.compactMap { (key, value) in
        Int(key).map { ($0, value) }
    }, uniquingKeysWith: { $1 })
    

    在重复键的情况下使用 { $1 } 最后一个 胜利。