Фильтровать массив пользовательских объектов с атрибутом и картой в Swift

Мой класс модели выглядит следующим образом:

struct Job: Decodable, Equatable, Hashable {
   var id: Int?
   var status: String?
   var priority: String?
}

У меня есть 2 массива объектов (работа) как:

 var jobModel = [Job]()
 var filteredJobModel = [Job]()

Регистр: jobModel состоит из 5 элементов. filteredJobModel имеет 2 элемента (подмножество jobModel). В filteredJobModel значение status для обоих объектов было изменено операцией search. Я хотел бы обновить jobModel обратно на filteredJobModel, где объект соответствует атрибуту id.

Есть ли способ, которым я могу добиться этого случая? Я мог бы использовать filter и map для [String], но я хотел бы знать, как реализовать функции более высокого порядка для массива пользовательских объектов.


person Alen Alexander    schedule 28.11.2019    source источник


Ответы (1)


for (index, job) in idsJobModel.enumerated() {
    if let match = arrFiltetered.first( where: {job.id == $0.id} ) {
     idsJobModel[index] = match
   }
}

Или, если вы предпочитаете использовать карту:

idsJobModel = idsJobModel.map {
    let myID = $0.id
    if let match = arrFiltetered.first( where: {myID == $0.id} ) {
        return match
    } else {
        return $0
    }
}

Любая версия приведенного выше кода будет иметь производительность O(n²), поэтому она будет значительно медленнее, когда размер ваших массивов превысит ≈30 элементов. Его нужно будет настроить, чтобы он хорошо работал на больших массивах.

person Duncan C    schedule 28.11.2019
comment
Предполагая, что значение id в idsJobModel всегда уникально (и никогда не равно нулю), вы можете улучшить производительность вышеописанного, сопоставив массив arrFiltetered со словарем, используя идентификатор в качестве ключа. затем вы просматриваете idsJobModel , выполняете поиск по словарю для каждого идентификатора и заменяете запись в idsJobModel, если она найдена, как указано выше (поиск по словарю почти O(1), так что это улучшит вашу производительность примерно до O(n), резкое улучшение. - person Duncan C; 28.11.2019
comment
Даже если ваши значения идентификатора не уникальны, вы можете реализовать пользовательскую хеш-функцию, которая исключает ваше (изменяемое) свойство статуса и использовать хэш в качестве ключа словаря в приведенной выше оптимизации скорости. - person Duncan C; 28.11.2019