Создать новый объект, используя два других, используя функцию карты - PullRequest
0 голосов
/ 30 апреля 2020

Учитывая эти два объекта:

struct Product {
    let id: Int
    let title: String
    let price: Int
    let categoryId: Int

}

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

Я также создал эти два массива данных:

let products = [
    Product(id: 1, title: "snake", price: 20, categoryId: 1),
    Product(id: 2, title: "soap", price: 20, categoryId: 2),
    Product(id: 3, title: "cream", price: 20, categoryId: 3),
    Product(id: 4, title: "dog", price: 20, categoryId: 1),
    Product(id: 5, title: "car", price: 20, categoryId: 4),
]

let categorieItems = [
    Category(id: 1, name: "animal"),
    Category(id: 2, name: "chemichal"),
    Category(id: 3, name: "food"),
    Category(id: 4, name: "travel"),
]

Я хочу создать новый объект с именем FinalObject:

struct FinalProduct {
    let id: Int
    let title: String
    let price: Int
    let categoryName: String
}

Это будет построено с использованием объектов Product и Category, чтобы иметь имя внутри объекта FinalProduct. Вот что я сделал, используя два цикла итерации, которые работают, но не являются лучшими:

var finalProducts = [FinalProduct]()
    for product in products {
        for cat in categorieItems {
            if product.categoryId == cat.id {
                finalProducts.append(FinalProduct(id: product.id, title: product.title, price: product.price, categoryName: cat.name))
            }
        }
    }

Как я могу упростить этот код с помощью функции карты?

1 Ответ

0 голосов
/ 30 апреля 2020

Вы должны преобразовать ваш массив categorieItems в словарь, сопоставив id с фактическим элементом. Тогда это действительно просто сделать:

let finalProducts: [FinalProduct] = products.compactMap { 
     let categoryItem = categorieItems[$0.id]
     return FinalProduct(id: $0.id, title: $0.title, price: $0.price, categoryName: categoryItem.name)
}
...