簡體   English   中英

快速映射兩個數組兩個一個對象

[英]Mapping two arrays two one object in swift

我有兩個不同的數組,它們試圖使用第一個數組ModelOne id的信息將它們映射到一個對象。 我使用兩個 for 循環來檢查模型一中的id是否出現在第二個數組中,如果為真,則創建一個具有模型一idname和模型二中所有名稱數組的對象。 從我的實施中無法獲得正確的結果。

// Model One
struct ModelOne: Codable {
    let id: Int
    let name: String
}

// Model two
struct ModelTwo: Codable {
    let id: Int
    let modelOneId: Int
    let name: String
}

var arrayOne = [ModelOne]()

arrayOne.append(ModelOne(id: 1, name: "One"))
arrayOne.append(ModelOne(id: 2, name: "Two"))

var arrayTwo = [ModelTwo]()

arrayTwo.append(ModelTwo(id: 1, modelOneId: 1, name: "Some name"))
arrayTwo.append(ModelTwo(id: 2, modelOneId: 1, name: "Other name"))
arrayTwo.append(ModelTwo(id: 1, modelOneId: 2, name: "Name one"))
arrayTwo.append(ModelTwo(id: 2, modelOneId: 2, name: "Name two"))

struct MappedModel {
    let id: Int
    let name: String
    let items: [String]
}

var arrayThree = [MappedModel]()

for i in arrayOne {
    for x in arrayTwo {
        if i.id == x.id {
            arrayThree.append(MappedModel(id: i.id, name: i.name, items: [x.name]))
        }
    }
}

如果我正確地解釋這個問題,你想要的MappedModelidnameModelOne ,與items包含所有的name ■從ModelTwo其中modelOneId比賽ModelOne id

如果是這樣,這將解決問題:

var combined = arrayOne.map { item1 in
    MappedModel(id: item1.id, name: item1.name, items: arrayTwo.compactMap { $0.id == item1.id ? $0.name : nil})
}

其中產生:

[
  MappedModel(id: 1, name: "One", items: ["Some name", "Other name"]),
  MappedModel(id: 2, name: "Two", items: ["Name one", "Name two"])
]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM