Arrays Swift 3.0删除字典数组中的重复项

Arrays Swift 3.0删除字典数组中的重复项,arrays,dictionary,set,swift3,Arrays,Dictionary,Set,Swift3,我正在swift 3.0中删除字典数组中的重复字典 以下是 let Dict1 : [String : String] = ["messageTo":"Madhu"] let Dict2 : [String : String] = ["messageTo":"Kiran"] let Dict3 : [String : String] = ["messageTo":"Raju"] var arrOfDict = [[String:String]]() arrOfDict.append(Dict1

我正在swift 3.0中删除字典数组中的重复字典

以下是

let Dict1 : [String : String] = ["messageTo":"Madhu"]
let Dict2 : [String : String] = ["messageTo":"Kiran"]
let Dict3 : [String : String] = ["messageTo":"Raju"]

var arrOfDict = [[String:String]]()
arrOfDict.append(Dict1)
arrOfDict.append(Dict2)
arrOfDict.append(Dict1)
arrOfDict.append(Dict3)
arrOfDict.append(Dict2
print(arrOfDict)

//prints [["messageTo": "Madhu"], ["messageTo": "Kiran"], ["messageTo": "Madhu"], ["messageTo": "Raju"], ["messageTo": "Kiran"]]
如您所见,arrOfDict中有两个重复的词典

是否有人可以帮助我使用Set或任何其他方法筛选重复项

您可以尝试以下方法:

var set = NSSet(array: arrOfDict)

它被复制的原因是,您将Dict1和Dict2添加了2次。我可以问一下为什么吗

集合不适用于您,因为字典类型不符合哈希协议,只符合其密钥属性


您可以对字典进行验证,如果已经存在类似的值,请不要将其附加到arrOfDict。

字典不符合Hashable或Equatable,因此在这种情况下,使用Set是不可用的方法。但是,对于键和值类型可相等的字典,我们可以访问==运算符,以便轻松执行字典数组的唯一性筛选:


我认为我们在Swift 3.0中不再需要NS了你好,你找到解决方案了吗?我面临着同样的问题,jigar dfri解决方案对我起了作用。
public func ==<Key : Equatable, Value : Equatable>(
            lhs: [Key : Value], rhs: [Key : Value]) -> Bool
arrOfDict = arrOfDict.enumerated()
    .filter { (idx, dict) in !arrOfDict[0..<idx].contains(where: {$0 == dict}) }
    .map { $1 }

print(arrOfDict)
// [["messageTo": "Madhu"], ["messageTo": "Kiran"], ["messageTo": "Raju"]]

// or ...
arrOfDict = arrOfDict.enumerated()
    .flatMap { (idx, dict) in !arrOfDict[0..<idx].contains(where: {$0 == dict}) ? dict : nil }
func removeDuplicates(_ arrayOfDicts: [[String: String]]) -> [[String: String]] {
var removeDuplicates = [[String: String]]()
var arrOfDict = [String]()
for dict in arrayOfDicts {
    if let name = dict["messageTo"], ! arrOfDict.contains(name) {
        removeDuplicates.append(dict)
        arrOfDict.append(name)
    }
}
return removeDuplicates
}