arrays - 合并有条件的数组

标签 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(id: 1, name: "Bogdan", value: 6)
let secondInSecond = Item(id: 2, name: "Max", value: 9)

数组:

 var fisrtArray = [fisrt, second]
 let secondArray = [fisrtInSecond, secondInSecond]

我想使用集合的 zipmap 函数来获得结果。结果是 fisrtArray 元素 namesid 更新。

示例: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/

相关文章:

ios - 如何从 WKWebViewConfiguration 中清除已注册的 urlSchemeHandler

c# - 枚举 DLL 函数?

c - 如何仅使用 1 个数组查找长度 >5 的单词?

php - php和javascript中的双数组问题

Swift:NSLengthFormatter 只有 1 个小数位

ios - Twitter 分享无法在设备上运行

javascript - 将对象数组转换为 TypeScript 中的字符串数组

javascript - 如何使用js查找对象数组中的重复数据?

javascript - 防止在作为参数传递的函数中丢失 'this' 变量的上下文

c++ - 使用自定义比较器传递 map 以发挥作用