Saltar al contenido

Eliminar objetos con propiedades duplicadas de la matriz Swift

Solución:

Voy a sugerir 2 soluciones.

Ambos enfoques necesitarán Post ser Hashable y equitativo

Poste conforme a Hashable y Equatable

Aquí estoy asumiendo tu Post estructura (o clase) tiene una id propiedad de tipo String.

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
}

Solución 1 (perdiendo el orden original)

Para eliminar duplicados, puede utilizar un Set

let uniquePosts = Array(Set(posts))

Solución 2 (preservando el orden)

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

Puede crear una matriz vacía “uniquePosts” y recorrer su matriz “Posts” para agregar elementos a “uniquePosts” y cada vez que agregue debe verificar si ya agregó el elemento o no lo hizo. El método “contiene” puede ayudarte.

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
}

mis soluciones Swift ‘puras’ sin conformidad de Post con Hashable (requerido por Set)

struct Post {
    var id: Int
}

let posts = [Post(id: 1),Post(id: 2),Post(id: 1),Post(id: 3),Post(id: 4),Post(id: 2)]

// (1)
var res:[Post] = []
posts.forEach { (p) -> () in
    if !res.contains ({ $0.id == p.id }) {
        res.append(p)
    }
}
print(res) // [Post(id: 1), Post(id: 2), Post(id: 3), Post(id: 4)]

// (2)
let res2 = posts.reduce([]) { (var r, p) -> [Post] in
    if !r.contains ({ $0.id == p.id }) {
        r.append(p)
    }
    return r
}

print(res2) // [Post(id: 1), Post(id: 2), Post(id: 3), Post(id: 4)]

Prefiero (1) encapsulado en función (también conocido como func unique(posts:[Post])->[Post] ), tal vez una matriz de extensión …

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : / /

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *