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
}