#json #swift #swifty-json
#json #swift #swifty-json
Вопрос:
У меня есть SwiftyJSON
массив, который имеет несколько вложенных уровней, и мне нужно отфильтровать массив на основе значения на самом низком уровне. Ниже приведен пример массива. Мне нужно его отфильтровать Active == true
. Какой наиболее эффективный способ добиться этого?
var colors = JSON([
"Apple" : [
"Yellow" : [
"Active" : true,
"Working" : true,
"Value" : 0
],
"Red" : [
"Active" : false,
"Working" : true,
"Value" : 0
]
],
"Banana" : [
"Blue" : [
"Active" : false,
"Working" : true,
"Value" : 0
],
"Green" : [
"Active" : true,
"Working" : true,
"Value" : 0
]
]
])
Желаемый результат:
"Apple" : [
"Yellow" : [
"Active" : true,
"Working" : true,
"Value" : 0
]
],
"Banana" : [
"Green" : [
"Active" : true,
"Working" : true,
"Value" : 0
]
]
Комментарии:
1. Массив представляет собой словарь.
2. @MikeDeluca Проверь мой ответ один раз.
Ответ №1:
Проверьте это
var filteredArray = [JSON]()
for item in colors {
for subItem in item.1 {
if subItem.1["Active"].boolValue {
filteredArray.append(JSON([item.0:JSON([subItem.0:subItem.1])]))
}
}
}
print(filteredArray)
Выводом является массив словарей отфильтрованных вложенных словарей с активным true:
[{
"Apple" : {
"Yellow" : {
"Working" : true,
"Value" : 0,
"Active" : true
}
}
}, {
"Banana" : {
"Green" : {
"Working" : true,
"Value" : 0,
"Active" : true
}
}
}]
Ответ №2:
вы можете создать цикл, который будет считывать все цвета, и внутри этого цикла создать цикл, который будет считывать другие элементы во втором массиве. Во втором случае вы проверяете, является ли элемент допустимым или нет, и сохраняете его в другом массиве
let activeItems = []
for item in colors {
for i in item as NSDictionary {
if i.objectForKey("Active") == true {
activeItems.addObject(i)
}
}
}
Комментарии:
1. Это не работает, потому что массив является JSON, выдавая ошибку
cannot convert value of type (String, JSON) to type NSDictionary
2. Это не массив.
3. @MikeDeluca Нет необходимости преобразовывать его в
NSDictionary
, это можно решить с помощью простого[JSON]
массиваSwiftyJSON
. Проверьте мой ответ
Ответ №3:
var result = [String:[String:JSON]]()
for (key, json) in colors.dictionaryValue {
let filtered = json.dictionaryValue.filter{$0.1["Active"].boolValue}
guard filtered.count > 0 else { continue }
var subDic = [String:JSON]()
filtered.forEach{subDic[$0.0] = $0.1}
result[key] = subDic
}
print(result)