Swift - сортировка массива объектов по свойству другого массива - PullRequest
1 голос
/ 16 марта 2019

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

    struct GeneralComposition : Decodable {
        let id, formId, relationId, fixedContentTypeId, separatorId: Int
        let orderBy: Int

    }
    struct FixedContentType: Decodable {
        let name, htmlType: String
        let isEditable: Int
        let typeId : String


    }



   var fixedContentType = [FixedContentType]()
   var generalComposition = [GeneralComposition]()

В GeneralComposition я получаю порядок, который должны быть у элементов, с orderBy, а затем беру fixedContentTypeID каждого элемента, сравниваем с typeId в FixedContentType, чтобы получить порядок, в котором это содержимое должно быть показано на экране.

Есть идеи о том, как это можно сделать?

Спасибо!

1 Ответ

3 голосов
/ 16 марта 2019

Вы можете создать словарь для fixedContentTypeID из generalComposition:

let order = generalComposition.reduce(into: [Int: Int]()) { result, value in
    result[value.fixedContentTypeId] = value.orderBy
}

Теперь у вас есть эффективный способ поиска значения orderBy для данного typeId в вашем массиве FixedContentType объектов. Вы можете использовать это для сортировки:

fixedContentType.sort {
    (order[$0.typeId] ?? 0) < (order[$1.typeId] ?? 0)
}

Кстати, ваш typeId - это String, а fixedContentTypeId - это Int. Я предполагаю, что это была опечатка, введенная при подготовке вопроса, и что они действительно Int. Если бы это были действительно разные типы (что было бы странно), решение было бы схожим, хотя вам пришлось бы делать некоторые преобразования. Но я не хотел туда ехать, если вы не подтвердили, что это именно то, что вы модель.

Но, учитывая, что ваш typeId действительно является String, вы можете сделать свой словарь [String: Int]:

let order = generalComposition.reduce(into: [String: Int]()) { result, value in
     result[String(value.fixedContentTypeId)] = value.orderBy
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...