Непонятно, что вы пытались и где вы застряли, вы действительно должны включить это - это не будет причиной того, что за вас проголосовали.
Однако, давайте посмотрим, сможем ли мы помочь.Вы заявляете, что ваш словарь имеет тип [String:Any]
и не указываете лимит вложенности, поэтому мы будем использовать следующие тестовые данные:
let sampleDict : [String:Any] =
[
"foo": [ "bar": "tralala" ],
"test": [ "foo": "bar", "staging": "hi"],
"staging" : 3,
"one" : [ "two" : [ "three" : 3, "staging" : 4.2]],
"aaa": [ "bbb": "cccc", "staging": "jjj"]
]
Если наш алгоритм справится с этим, он должен справиться с чем угодно (известныйпоследние слова ...).
Простой алгоритм, использующий предопределенные методы и избегающий циклов:
- Фильтрует словарь, удаляя любые пары ключ / значение, где ключ должен быть удален.
- Сопоставить значения в отфильтрованном словаре для любого значения, которое само является словарем
[String:Any]
, рекурсивно применить этот алгоритм к значению.
В Swift:
func removeMatchingKeys(_ dict : [String:Any], _ keysToRemove : [String]) -> [String:Any]
{
return dict
// filter keeping only those key/value pairs
// where the key isn't in keysToRemove
.filter { !keysToRemove.contains($0.key) }
// map the values in the filtered dictionary recursing
// if the value is itself a [String:Any] dictionary
.mapValues
{ if let nested = $0 as? [String:Any]
// value is dictionary, recurse
{ return removeMatchingKeys(nested, keysToRemove) }
else
// value isn't a dictionary, leave as is
{ return $0 }
}
}
Проверка этого с помощью ключей:
let sampleKeys = ["test", "staging"]
Оператор:
print( removeMatchingKeys(sampleDict, sampleKeys) )
Производит:
["foo": ["bar": "tralala"], "aaa": ["bbb": "cccc"], "one": ["two": ["three": 3.0]]]
Приведенный выше алгоритм выполняет два проходаданные, сначала отфильтровать его, а затем сопоставить его.Если и только если , это оказывается проблемой производительности, вы можете заменить две предопределенные функции filter
и map
простым рукописным циклом, который объединяет операции и передает только черезданные один раз.
Примечание. Выше используется Xcode 10 / Swift 4.2, используйте любую другую версию и YMMV (т. е. синтаксис и предварительно определенные функции могут легко отличаться), но алгоритм все еще применим.