Изменить тип ключа в словаре - PullRequest
0 голосов
/ 06 октября 2018

Я получил этот JSON:

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

Ключ в JSON может быть только строкой, поэтому при получении этого JSON я получил следующее объявление:

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

Теперь я хочу отфильтровать все ключи, которые можно преобразовать в целое число, поэтому я хочу использовать следующий словарь:

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

Как мне compactMap / filter myJson to myJson2 чтобы отфильтровать все клавиши Int и скопировать значение?Я получил это:

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

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

Но я ищу решение с CompactMap, которое может сделать это в 1 строку

1 Ответ

0 голосов
/ 06 октября 2018

Вы можете использовать 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 } последний «выигрывает».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...