2017-10-04 139 views
1

比方说,我有字典的两个数组:合并基于共享价值的字典两个数组

[["id":"1","color":"orange"],["id":"2","color":"red"]] 

[["id":"1","fruit":"pumpkin"],["id":"2","fruit":"strawberry"]] 

如何合并这些基于“ID”,让我得到

[["id":"1","color":"orange","fruit":"pumpkin"],["id":"2","color":"red","fruit":"strawberry"]] 

我们知道两个数组的长度是相同的。我们不知道这两个数组是否会以相同的顺序排列。

在Swift中合并每个字典的最佳方式是什么?

回答

0

对于这个答案,我会认为第一Array是可变的:

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 
     } 
     } 
    } 
    } 
} 
2

雨燕标准库中的Xcode 9介绍merge

的代码过滤器array2具有相同id相应的字典,并融合了键和值到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) 

我不知道,如果merge是在雨燕3.2可用,也

+0

合并仅适用于Swift 4 Xcode 9 https://developer.apple.com/documentation/swift/dictionary/2919536-merge –

0

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