Arrays 合并具有条件的数组

Arrays 合并具有条件的数组,arrays,swift,function,loops,swift3,Arrays,Swift,Function,Loops,Swift3,我想合并两个具有特定条件的数组,并更新它们所包含的对象 首先是数组中的我的结构: struct Item { var id:Int var name:String var value:Int } 两个阵列的第二个元素: let fisrt = Item(id: 1, name: "Oleg", value: 3) let second = Item(id: 2, name: "Olexander", value:5) let fisrtInSecond = Item(

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

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

struct Item {
    var id:Int
    var name:String
    var value:Int
}
两个阵列的第二个元素:

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)
阵列:

 var fisrtArray = [fisrt, second]
 let secondArray = [fisrtInSecond, secondInSecond]
我想使用集合的
zip
map
函数来获得结果。结果是,
fisrtaray
元素
名称
id
更新

示例:
fisrtaray=[项目(id:1,名称:“Bogdan”,值:3),项目(id:2,名称:“Max”,值:5)]

我知道如何通过简单的循环来实现这一点。但我正在寻找更先进的功能编程的使用是迅速的

我的实验:

fisrtArray = zip(fisrtArray, secondArray).map()
主要问题是我不知道如何在
map
函数中写入条件。条件应为:

if ($0.id == $1.id) {
   $0.name = $1.name
}

从讨论的评论中,可以强调指出
zip
不适合我的情况,因为我们应该迭代所有数组,以确定我们是否具有顺序不同的相似id。
针对上述特定问题的解决方案是:

struct Item {
    var id: Int
    var name: String
}

let first = Item(id: 1, name: "Oleg")
let second = Item(id: 2, name: "Olexander")

let firstInSecond = Item(id: 1, name: "Bogdan")
let secondInSecond = Item(id: 2, name: "Max")

let ret = zip([first, second], [firstInSecond, secondInSecond]).map({
    return $0.id == $1.id ? $1 : $0
})


=>但它要求第一个数组中的项与第二个数组中的项一样多,并且它们具有相同顺序的相同ID…

映射函数不能直接改变其元素。而且,由于您使用的是结构(按值传递),因此无论如何它都不会工作,因为您在$0中看到的版本与数组中的版本是不同的实例。要正确使用
map
,我将使用如下闭包:

fisrtArray = zip(fisrtArray, secondArray).map() {
   return Item(id: $0.id, name: $1.name, value: $0.value)
}
这将产生您期望的结果


现在,如果您的结构是对象(值类型而不是引用类型),您可以使用
forEach
并在其中执行
$0.name=$1.name

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

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
}
[项目(id:1,名称:“Bogdan”,值:3),项目(id:2,名称:“Max”,值:5)]\n

更新 以下版本首先使用
(其中:
方法,如
Martin R.


如果id为2的项在第二个数组中排在第一位呢?嗯,你是对的,我们应该迭代所有数组,以确定我们是否有类似的id'sSo,你不能使用zip(),您每次都必须从第二个数组中的第一个数组中查找。数组有多大?数组不超过20个元素作为Swift 3,您也可以使用
secondArray.first(其中:{$0.id==item.id})
查找第一个匹配的元素。@MartinR:非常有用,刚刚添加到我的答案中。谢谢!
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
}