Swift 基于共享值合并两个字典数组
假设我有两个字典数组:Swift 基于共享值合并两个字典数组,swift,Swift,假设我有两个字典数组: [["id":"1","color":"orange"],["id":"2","color":"red"]] 及 如何根据“id”合并这些文件,以便 [["id":"1","color":"orange","fruit":"pumpkin"],["id":"2","color":"red","fruit":"strawberry"]] 我们知道这两个数组的长度相同。我们不知道这两个数组的顺序是否相同 在Swift中合并每个词典的最佳方法是什么?对于这个答案,我假设第一
[["id":"1","color":"orange"],["id":"2","color":"red"]]
及
如何根据“id”合并这些文件,以便
[["id":"1","color":"orange","fruit":"pumpkin"],["id":"2","color":"red","fruit":"strawberry"]]
我们知道这两个数组的长度相同。我们不知道这两个数组的顺序是否相同
在Swift中合并每个词典的最佳方法是什么?对于这个答案,我假设第一个
数组是可变的:
var xs = [["id": "1", "color": "orange"], ["id": "2", "color": "red"]]
let ys = [["id": "1", "fruit": "pumpkin"], ["id": "2", "fruit": "strawberry"]]
for x in xs.enumerated() {
for y in ys {
if x.element["id"] == y["id"] {
for (key, value) in y {
if x.element[key] == nil {
xs[x.offset][key] = value
}
}
}
}
}
Xcode 9中的Swift标准库引入了merge
代码使用相同的id
过滤array2
的对应字典,并将键和值合并到array1
:
var array1 = [["id":"1","color":"orange"], ["id":"2","color":"red"]]
var array2 = [["id":"1","fruit":"pumpkin"], ["id":"2","fruit":"strawberry"]]
for (index, item) in array1.enumerated() {
if let filtered = array2.first(where: {$0["id"]! == item["id"]! }) {
array1[index].merge(filtered) { (current, _) in current }
}
}
print(array1)
我不知道Swift 3.2中是否也提供了merge
Swift 4的新字典初始值设定项将让您实现一些令人印象深刻的魔法,包括如下合并:
let a1 = [["id":"1","color":"orange"],["id":"2","color":"red"]]
let a2 = [["id":"1","fruit":"pumpkin"],["id":"2","fruit":"strawberry"]]
let merged = Dictionary((a1+a2).map{($0["id"]!,Array($0))}){$0 + $1}
.map{Dictionary($1 as [(String,String)]){$1}}
print(merged)
// [["id": "2", "fruit": "strawberry", "color": "red"], ["id": "1", "fruit": "pumpkin", "color": "orange"]]
合并仅在Swift 4 Xcode 9之后可用
let a1 = [["id":"1","color":"orange"],["id":"2","color":"red"]]
let a2 = [["id":"1","fruit":"pumpkin"],["id":"2","fruit":"strawberry"]]
let merged = Dictionary((a1+a2).map{($0["id"]!,Array($0))}){$0 + $1}
.map{Dictionary($1 as [(String,String)]){$1}}
print(merged)
// [["id": "2", "fruit": "strawberry", "color": "red"], ["id": "1", "fruit": "pumpkin", "color": "orange"]]