在多维数组上使用`flatMap()。filter()。map()`

时间:2017-07-25 16:05:01

标签: arrays swift multidimensional-array

我使用以下方法从嵌套数组中查找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.forEachselected.isEmpty

注意:我需要在上面的integers?.isEmpty方法中提供帮助,下面你会找到要播放的数据和结构,还有数组的截图。

提前致谢!

enter image description here

结构&数据

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))
    }
}

1 个答案:

答案 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"]

注意:为了更好地理解输出,请尝试逐行打印