Swift:迭代并将字典项与数组中的字典项进行比较

时间:2017-02-01 05:11:29

标签: ios arrays swift

我需要将一个词典数组中的项目与另一个词典数组中的所有项目进行比较,并找出第一个项目是否在第二个数组中。

例如,array1中包含一个带有[{"name": "zach", "age": "twenty"}, {"name": "ben", "age": "fifteen"}, etc.]的字典。 Array2与[{"name" = "eli", "age": "fifteen"}, {"name" = "will", "age": "fifteen"}, etc.]类似。

如果zach不在array2中,我想将他添加到它中。如何从第一个字典数组中获取项目并将它们与第二个数组中的所有项目进行比较,以便我知道是否应该添加它?

3 个答案:

答案 0 :(得分:2)

Dictionary没有重复的密钥。在您的前任中,您在同一name中使用Dictionary键两次,但这是不可能的,但如果您有类似下面的数组。

let array1 = [["name": "zach"], ["name": "eli"], ["name": "ben"]]
var array2 = [["name": "eli"], ["name" : "will"]]

然后您可以尝试在array2中添加zachben名称。

let array2Name = array2.flatMap({$0["name"]}) // ["eli", "will"]       
array2 = array1.reduce(array2) { !array2Name.contains($1["name"] ?? "") ? $0 + [$1] : $0 }
print(array2)

输出

[["name": "eli"], ["name": "will"], ["name": "zach"], ["name": "ben"]]

修改:您遇到此问题,因为您的数组类型为[[String:Any]]且有问题,您显示为[[String:String]]类型的数组,因此更改上面的代码就像这对你有用。

let array2Name = array2.flatMap({$0["name"] as? String}) // ["eli", "will"]
array2 = array1.reduce(array2) { !array2Name.contains($1["name"] as? String ?? "") ? $0 + [$1] : $0 }
print(array2)

答案 1 :(得分:0)

我猜你的问题可能更复杂,但是Dictionary是基于其内容的Equatable,这意味着你可以迭代第一个数组,并查询第二个数组,看它是否包含相同的字典。像这样:

let array1 : [Dictionary<String, String>] = [["one" : "two"], ["three" : "four"]]
let array2 : [Dictionary<String, String>] = [["one" : "two"], ["three" : "five"]]
var doesContain = false
for dict in array1 {
    if array2.contains(where: { $0 == dict} ) {
        doesContain = true
    }
}
print(doesContain) // Should be true in this case, because both arrays contain ["one" : "two"]; if they had no duplicates, doesContain would remain false

答案 2 :(得分:0)

如果我理解正确,您希望拥有一系列独特的词典。我建议你这样做:

let array1: [String] = [["name":"test1"], ["name":"test12"]].flatMap { $0["name"] }
let array2: [String] = [["name":"test1"], ["name":"test3"]].flatMap { $0["name"] }
let set = Set<String>(array1).union(Set<String>(array2))
let resultArrayOfDicts = set.map{ ["name": $0] }