flatMap словарь словарей в Swift
У меня есть NSEnumerator
который содержит вложенные объекты значения ключа, как это:
[ "posts" :
["randonRootKey1" :
["randomChildKey1" : [:] ]
],
["randonRootKey2" :
["randomChildKey2" : [:] ],
["randomChildKey3" : [:] ],
]
]
- posts
-- user1
--- posts
----post
-- user2
-- posts
--- post
Я хочу извлечь все сообщения всех пользователей в одном массиве... последний ребенок и все родители являются словарями
Я хочу, чтобы flatMap это было:
[
["randomChildKey1" : [:] ],
["randomChildKey2" : [:] ],
["randomChildKey3" : [:] ]
]
Обратите внимание, что я извлек объекты каждого корневого словаря.
Я пытался:
let sub = snapshot.children.flatMap({$0})
но не похоже на работу
2 ответа
Предполагая, что вход будет в этом формате
let input: [String: [String: [String: Any]]] = ["posts":
[
"randonRootKey1": [
"randomChildKey1": [:],
],
"randonRootKey2": [
"randomChildKey2": [:],
"randomChildKey3": [:],
]
]
]
Используя это
let output = input.flatMap{$0.1}.flatMap{$0.1}
Вы получите желаемый результат
[("randomChildKey1", [:]), ("randomChildKey2", [:]), ("randomChildKey3", [:])]
Если вы хотите преобразовать кортеж в словарь, используйте reduce
let output = input.flatMap{$0.1}.flatMap{$0.1}.reduce([String: Any]())
{
(var dict, tuple) in
dict.append([tuple.0: tuple.1])
return dict
}
[["randomChildKey1": {}], ["randomChildKey2": {}], ["randomChildKey3": {}]]
let input: [String: [String: [String: Any]]] = ["posts":
[
"randonRootKey1": [
"randomChildKey1": [:],
],
"randonRootKey2": [
"randomChildKey2": [:],
"randomChildKey3": [:],
]
]
]
var output = [String: Any]()
for dictionary in input["posts"]!.values {
for (key, value) in dictionary {
output[key] = value
}
}
print(output)
["randomChildKey3": [:], "randomChildKey2": [:], "randomChildKey1": [:]]