我想合并两个具有特定条件的数组并更新它们包含的对象。
首先是我的数组结构:
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
函数来获得结果。结果是 fisrtArray
元素 names
由 id
更新。
示例:fisrtArray = [Item(id: 1, name: "Bogdan", value:3), Item(id: 2, name: "Max", value:5)]
我知道如何通过简单的循环来做到这一点。但我正在寻找函数式编程的更高级用法是 Swift。
我的实验:
fisrtArray = zip(fisrtArray, secondArray).map()
主要问题我不知道如何在 map
函数中写条件。条件应该是:
if ($0.id == $1.id) {
$0.name = $1.name
}
从讨论的评论中可以强调 zip
不适合我的情况,因为我们应该遍历所有数组以查找我们是否有相似的 id 但不在同一个顺序。
最佳答案
下面的代码确实按照 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
}
"[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
}
关于arrays - 合并有条件的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40263697/