Получение общих данных из двух разных типов массивов - PullRequest
1 голос
/ 07 ноября 2019
struct Human{
    let name: String
    let id: String
    let travelled: String
}

struct Animal {
    let name: String
    let id: String
    let travelled: String
}

// Consider no human and animal object can have same name
let human1 = Human(name: "vikas", id: "12", travelled: "123")
let human2 = Human(name: "jacky", id: "15", travelled: "343")
let human3 = Human(name: "lucy", id: "32", travelled: "132")
let animal1 = Animal(name: "jacky", id: "56", travelled: "8979")
let animal2 = Animal(name: "lucy", id: "78", travelled: "678")
let animal3 = Animal(name: "jimmy", id: "98", travelled: "690")
let humans = [human1, human2, human3]
let animals = [animal1, animal2, animal3]

var list = [[String: String]]()
// can we eleminate this for loop with filter or something else
for human in humans {
    if let animal = animals.first(where: {$0.name == human.name}){
        let data = ["humanId": human.id, "animalId": animal.id]
        list.append(data)
    }
}
print(list)

Вывод:

[["humanId": "15", "animalId": "56"], ["humanId": "32", "animalId": "78"]]

Есть ли способ применить несколько фильтров одновременно, чтобы получить желаемый результат Невозможно найти или создать один

Ответы [ 3 ]

1 голос
/ 07 ноября 2019

В этом решении все еще используется цикл, но он найдет несколько совпадений, если таковые существуют

animals.forEach {animal in
    let filtered = humans.filter { $0.name == animal.name }
        .map { human -> [String: String] in ["humanId": human.id, "animalId": animal.id] }

    list.append(contentsOf: filtered)
}
1 голос
/ 07 ноября 2019

Вместо этого можно попробовать compactMap(_:).

let list = humans.compactMap { (human) -> [String:String]? in
    if let animal = animals.first(where: { $0.name == human.name }) {
        return ["humanId": human.id, "animalId": animal.id]
    }
    return nil
}
0 голосов
/ 07 ноября 2019

Вот оно

for index in 0..<humans.count {
    list[index]["humanId"] = humans[index]
    list[index]["animalId"] = animals[index]
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...