【问题标题】:Using `flatMap().filter().map()` together on a multidimensional array在多维数组上一起使用 `flatMap().filter().map()`
【发布时间】: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.isEmptyintegers?.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


【解决方案1】:

我的方法是使用 double 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"]

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

【讨论】:

  • 感谢您的回复,虽然这几乎就像我想要的一样,但我仍然无法使用它:) 我的 JSON 中有 innerArray,我在您的回答中没有看到 (检查我的截图)。请看一下我刚刚提供的数据和结构,你能在extractIdentifiers 方法中使用你的行吗
  • @AamirR 是的,你不会看到“innerArray”键,因为我们使用双 flatmap() 折叠它两次。所以删除了两层。可以尝试使用flatmap一一了解结果
猜你喜欢
  • 2019-10-10
  • 2016-02-18
  • 2020-07-27
  • 2019-06-14
  • 2018-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-24
相关资源
最近更新 更多