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": [:]]

Другие вопросы по тегам