首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >从Swift数组中删除具有重复属性的对象

从Swift数组中删除具有重复属性的对象
EN

Stack Overflow用户
提问于 2016-01-11 02:15:52
回答 16查看 41K关注 0票数 32

这里的问题涉及从数组中删除重复的对象:

Removing duplicate elements from an array in Swift

相反,我需要删除一些对象,这些对象本身不是重复的,但具有特定的重复属性,比如id

我有一个包含Post对象的数组。每个Post都有一个id属性。

有没有比在我的数组中查找重复的帖子ID更有效的方法

for post1 in posts {
    for post2 in posts {
        if post1.id == post2.id {
            posts.removeObject(post2)
        }
    }
}
EN

回答 16

Stack Overflow用户

回答已采纳

发布于 2016-01-11 02:20:31

我将提出两个解决方案。

这两种方法都需要PostHashable和Equatable

符合Hashable和Equatable的帖子

这里我假设您的Post结构(或类)有一个String类型的id属性。

struct Post: Hashable, Equatable {
    let id: String
    var hashValue: Int { get { return id.hashValue } }
}

func ==(left:Post, right:Post) -> Bool {
    return left.id == right.id
}

解决方案1(丢失原始订单)

要删除重复项,可以使用Set

let uniquePosts = Array(Set(posts))

解决方案2(保留顺序)

var alreadyThere = Set<Post>()
let uniquePosts = posts.flatMap { (post) -> Post? in
    guard !alreadyThere.contains(post) else { return nil }
    alreadyThere.insert(post)
    return post
}
票数 55
EN

Stack Overflow用户

发布于 2019-10-01 17:50:29

你可以创建一个空数组"uniquePosts",然后循环你的数组"Posts“将元素追加到"uniquePosts”,每次追加时你都要检查是否已经追加了元素。

func removeDuplicateElements(post: [Post]) -> [Post] {
    var uniquePosts = [Post]()
    for post in posts {
        if !uniquePosts.contains(where: {$0.postId == post.postId }) {
            uniquePosts.append(post)
        }
    }
    return uniquePosts
}
票数 16
EN

Stack Overflow用户

发布于 2020-10-27 05:33:51

保留原始顺序的通用解决方案是:

extension Array {
    func unique(selector:(Element,Element)->Bool) -> Array<Element> {
        return reduce(Array<Element>()){
            if let last = $0.last {
                return selector(last,$1) ? $0 : $0 + [$1]
            } else {
                return [$1]
            }
        }
    }
}

let uniquePosts = posts.unique{$0.id == $1.id }
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34709066

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档