我使用以下方法从嵌套数组中查找identifier
isBoolTrue==true
(下面的数组和数据结构的屏幕截图)
func extractIdentifiers(mainArray: [MainItem]) -> [Int]? {
var selected = [Int]()
mainArray.forEach { element in
let integers = element.innerArray?.filter({ $0.isBoolTrue }).map {
Int($0.identifier)!
}
if !(integers?.isEmpty ?? true) {
selected += integers!
}
}
return selected.isEmpty ? nil : selected
}
问题:可以使用某种链接flatMap().filter().map()
来生成相同的结果[Int]?
,这样我就可以消除{{}的使用1}}和那些条件检查mainArray.forEach
和selected.isEmpty
?
注意:我需要在上面的integers?.isEmpty
方法中提供帮助,下面你会找到要播放的数据和结构,还有数组的截图。
提前致谢!
结构&数据
extractIdentifiers
测试&输出
struct InnerItem {
let identifier: String
var isBoolTrue: Bool
}
struct MainItem {
var innerArray: [InnerItem]?
}
let str = "[{\"innerArray\":[{\"identifier\":\"0\",\"isBoolTrue\":true},{\"identifier\":\"1\",\"isBoolTrue\":false}]},{\"innerArray\":[{\"identifier\":\"3\",\"isBoolTrue\":true},{\"identifier\":\"4\",\"isBoolTrue\":false}]},{\"innerArray\":null}]"
let data = str.data(using: String.Encoding.utf8)!
let json = try JSONSerialization.jsonObject(with: data, options: .allowFragments) as? [[String : Any]]
var mainArray = [MainItem]()
json!.forEach { dict in
if let array = dict["innerArray"] as? [[String: Any]] {
let innerArray = array.map {
InnerItem(identifier: $0["identifier"] as! String, isBoolTrue: $0["isBoolTrue"] as! Bool)
}
mainArray.append(MainItem(innerArray: innerArray))
}
}
答案 0 :(得分:2)
我的方法是使用双flatMap
将嵌套数组展平为字典数组,然后使用true
值过滤这些对象,最后使用map获取"标识符"值。
let result = data.flatMap { $0.flatMap { $0.value } } // this line will flatten into one level
.filter { $0["isBoolTrue"] == true }
.map { $0["identifier"] }
print(result) // this will output ["0", "3"]
注意:为了更好地理解输出,请尝试逐行打印