【发布时间】:2017-07-25 16:05:01
【问题描述】:
我使用以下方法从嵌套数组中找到identifier where 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]?,这样我就可以消除使用 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))
}
}
测试和输出
var selected: [Int]? // FILL THIS ARRAY WITH `identifier`
// Test1
selected = extractIdentifiers(mainArray: mainArray) // OUTPUT: [0, 3]
// Test2
mainArray[0].innerArray![0].isBoolTrue = false
selected = extractIdentifiers(mainArray: mainArray) // OUTPUT: [3]
// Test3
mainArray[1].innerArray![0].isBoolTrue = false
selected = extractIdentifiers(mainArray: mainArray) // OUTPUT: nil
【问题讨论】:
-
给我们一个我们可以实际使用的数据结构。我不会浪费时间转录那张照片并为它编写 json 解析代码
-
@Alexander 一会儿我会发布数据结构,抱歉耽搁了,现在保姆
标签: arrays swift multidimensional-array