Записать al oop метод массива для фильтрации указанного c значения - PullRequest
1 голос
/ 29 апреля 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"),
]

Я хочу создать новый массив, который содержит имена всех категории продуктов:

func handleCategories() -> [String] {
    var categoryNames = [String]()

    for product in products {
        for categorieItem in categorieItems {
            if product.categoryId == categorieItem.id {
                categoryNames.append(category.name)
            }
        }
    }
    return categoryNames
}

Этот метод работает, но я хочу написать один с закрытием (я думаю, что map () должен работать)

Результат должен быть:

categoryNames = ["animal", "chemichal", "food", "animal", "travel"]

1 Ответ

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

Создайте словарь, который будет обозначать категорию с помощью id, и сопоставьте каждый продукт с категорией, посмотрев его categoryId в этом диктанте.

Я использовал принудительное развертывание, предполагая, что продукты не не может содержать недопустимых categoryId с.

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"),
]

let categoriesById = Dictionary(uniqueKeysWithValues:
    categorieItems.map { (key: $0.id, value: $0) }
)

let productCategoryNames = products.map { categoriesById[$0.categoryId]!.name }
print(productCategories)
...