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"]]