Swift 过滤嵌套对象数组

Jam*_*mes 6 swift

我有一组业务对象。每个 Business 对象都包含一组键值对,其中一个元素可以是 ContentBlocks 对象的嵌套数组。

var masterArray = [
        Business(busName: "Dave's Cafe", busId: 1, website: "http://www.davescafe.com", latLong: (45.541, -45.609),
            actions: [["title": "About Us", "contentId": "123", "actionType": "content"],
                ["title": "Website", "url": "http://www.davescafe.com", "actionType": "web"]],
            contentBlocks:[
                ContentBlock(busName: "Dave's Cafe", busId: 1, contentId: "123", title: "Testola!", body: "Hello there!")
            ]),
        Business(busName:...
]
Run Code Online (Sandbox Code Playgroud)

我可以使用以下内容过滤数组以返回与唯一匹配的特定企业busId

let rtnArray = masterArray.filter{$0.busId == id}
    if rtnArray.count == 1{
        return rtnArray[0]
    } else {
        return // feedback that no matches were found
    }
Run Code Online (Sandbox Code Playgroud)

此外,我想通过过滤唯一的内容来返回特定的内容块contentId(如有必要,我也可以传递busId业务“所有者”的 )。我真的在努力前进,所以任何指向正确方向的指针都会很棒。

Ale*_*ica 7

这是我认为您要问的问题的解决方案:

 var contentBlocks = masterArray
                         .flatMap{$0.contentBlocks}
                         .flatMap{$0}
                         .filter{$0.contentId == "123"}
Run Code Online (Sandbox Code Playgroud)

输出[ContentBlock]包含所有ContentBlock对象中与过滤器匹配的所有Business对象。

  1. 第一个 flatMap 将Businesses的列表变成一个[ContentBlock?]
  2. flatMap 将其展平[ContentBlock?]成一个[ContentBlock]
  3. [ContentBlock]过滤