合并具有条件的数组

Ole*_*huk 3 arrays loops function swift swift3

我想合并具有特定条件的两个数组并更新它们包含的对象.

首先是我在数组中的结构:

struct Item {
    var id:Int
    var name:String
    var value:Int
}
Run Code Online (Sandbox Code Playgroud)

两个数组的第二个元素:

let fisrt = Item(id: 1, name: "Oleg", value: 3)
let second = Item(id: 2, name: "Olexander", value:5)

let fisrtInSecond = Item(id: 1, name: "Bogdan", value: 6)
let secondInSecond = Item(id: 2, name: "Max", value: 9)
Run Code Online (Sandbox Code Playgroud)

阵列:

 var fisrtArray = [fisrt, second]
 let secondArray = [fisrtInSecond, secondInSecond]
Run Code Online (Sandbox Code Playgroud)

我喜欢使用zipmap集合的功能来实现结果.结果是fisrtArray 元素names被更新id.

例: fisrtArray = [Item(id: 1, name: "Bogdan", value:3), Item(id: 2, name: "Max", value:5)]

我知道如何通过简单的循环来做到这一点.但我正在寻找功能编程的更高级用法是Swift.

我的实验:

fisrtArray = zip(fisrtArray, secondArray).map()
Run Code Online (Sandbox Code Playgroud)

主要问题我不知道如何在map函数中写条件.条件应该是:

if ($0.id == $1.id) {
   $0.name = $1.name
}
Run Code Online (Sandbox Code Playgroud)

从评论讨论中可以突出显示zip在我的情况下不合适,因为我们应该迭代所有数组以查找我们是否具有不同顺序的相似id.

Luc*_*tti 7

以下代码根据2个数组中元素的顺序独立工作

firstArray = firstArray.map { (item) -> Item in
    guard
        let index = secondArray.index(where: { $0.id == item.id })
        else { return item }
    var item = item
    item.name = secondArray[index].name
    return item
}
Run Code Online (Sandbox Code Playgroud)

"[Item(id:1,name:"Bogdan",value:3),Item(id:2,name:"Max",value:5)] \n"

更新

以下版本使用了first(where:建议的方法Martin R.

firstArray = firstArray.map { item -> Item in
    guard let secondElm = secondArray.first(where: { $0.id == item.id }) else { return item }
    var item = item
    item.name = secondElm.name
    return item
}
Run Code Online (Sandbox Code Playgroud)

  • 从Swift 3开始,您还可以使用`secondArray.first(where:{$ 0.id == item.id})`来查找第一个匹配的*元素.* (3认同)