arrays - 通过唯一字典值过滤字典数组的简洁方法

标签 arrays swift dictionary filter

假设我有一个对象:

struct Foo {
    let id: Int
    let bar: Int
}

现在我在一个数组中有 5 个这样的对象:

let foo1 = Foo(id: 1, bar: 1)
let foo2 = Foo(id: 2, bar: 1)
let foo3 = Foo(id: 3, bar: 2)
let foo4 = Foo(id: 4, bar: 3)
let foo5 = Foo(id: 5, bar: 3)

let fooArray = [foo1, foo2, foo3, foo4, foo5] 

过滤具有唯一 bar 值的 foo 对象的干净方法是什么?

// Desired output
let filteredArray = [foo1, foo3, foo4]

假设有几百到几千个对象需要迭代。

最佳答案

一种可能的方法是使用一个 Set 来跟踪哪个 bar 值已经看到了:

var seenBarValues = Set<Int>()
let filteredArray = fooArray.filter { foo in
    if seenBarValues.contains(foo.bar) {
        // We already had a `Foo` with this `bar` value: skip.
        return false 
    } else {
        // First `Foo` with this `bar` value: remember and include.
        seenBarValues.insert(foo.bar)
        return true
    }
}

正如@Hamish 正确指出的那样,这可以缩短为

var seenBarValues = Set<Int>()
let filteredArray = fooArray.filter { 
    seenBarValues.insert($0.bar).inserted
}

利用事实

public mutating func insert(_ newMember: Element) -> (inserted: Bool, memberAfterInsert: Element)

返回一个元组,其第一个成员指示元素是否相等 到新插入的那个已经存在于集合中。

关于arrays - 通过唯一字典值过滤字典数组的简洁方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42542035/

相关文章:

php - 如何解析PHP中的elasticsearch响应

Ruby 访问哈希元素

ios - 向 UIImage 应用渐变

java - 构建作为 HashMap 但在输入和输出上转换值的 Java Map 的正确方法是什么?

python - 过滤包含元组字符串的 Python 字典值中的项目

java - 如何从 Java 中的方法返回通用 Map

javascript - 如何用函数链中的空字符串替换数据库中的空值

javascript - 如何 JSON.stringify 对象数组

swift - 在 UITableViewCell 中按下完成按钮时无法关闭 KeyBoard

swift - 动态设置多个值