gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 22:12:09 26 4
gpt4 key购买 nike

假设我有一个对象:

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com