如何在Swift中通过另一个数组筛选项目数组

3

我有一个名为“Item”和“Tag”的模型。 Item具有多个标签。 我需要通过另一个标签数组来过滤项目数组。 要用于筛选的标签由字符串数组给出。

我搜索了一下,但找不到解决我的情况的答案。

struct Tag {
    let id: Int
    let name: String
}

struct Item {
    let id: Int
    let tags: [Tag]
}

func filter(items: [Item], contains tags: [String]) -> [Item] {
    // Need to implement filter
}

1个回答

3
请选择两个选项中的一个以返回:
     func filter(items: [Item], contains tags: [String]) -> [Item] {
        items.filter { (item) -> Bool in
            let tagNames = item.tags.map({ $0.name })
            return tags.allSatisfy(tagNames.contains)
            return Set(tags).isSubset(of: Set(tagNames))
        }
    }

map 是浪费的,你可以直接这样做:tags.allSatisfy { tag in item.tags.contains(tag) } - Alexander
@Alexander,这个标签是[String],但是item.tags是[Tag]。 - goat_herd
1
那么,代码如下:tags.allSatisfy { tag in item.tags.contains(where: { $0.name == tag.name } } - Alexander
@Alexander 谢谢你,但应该是:tags.allSatisfy { tag in item.tags.contains(where: { $0.name == tag })}。如果写成这样,我认为这个问题的所有者会很难理解。 - goat_herd
1
是的,我会将那个谓词提取到一个命名函数中,比如 hasTag,这样它就可以像这样阅读:tags.allSatisfy(item.hasTag) - Alexander
你好,我正在尝试将代码改为使用标签集合而不是标签数组。这有可能吗? - Manuel Zompetta

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接