从字典数组中删除重复值

1 dictionary swift

我有一个 swift 数组,我想从重复值(及其值)中删除重复的单个值,如下所示:

var myArray = [
        [
            "name": "John",
            "age": 21
        ],
        [
            "name": "Bob",
            "age": 35
        ],
        [
            "name": "Nyan",
            "age": 20
        ],
        [
            "name": "Nyan",
            "age": 20
        ]
    ]
Run Code Online (Sandbox Code Playgroud)

我使用以下代码删除重复值

for i in 0...myArray.count - 1{
        if(myArray[i]["name"] as! String == "Nyan"){
                print(myArray.remove(at: i))
        }
}

print(myArray)
Run Code Online (Sandbox Code Playgroud)

这不会减少 myArray.count 并给出致命错误:索引超出范围
所需的输出:

[
    "name": "John",
    "age": 21
],
[
    "name": "Bob",
    "age": 35
],
[
    "name": "Nyan",
    "age": 20
]
Run Code Online (Sandbox Code Playgroud)

vad*_*ian 5

而不是删除我建议创建新数组的项目。

您还需要一个辅助数组来收集名称。如果names数组不包含当前名称,则将名称添加到数组并将项目添加到result

let myArray = [
    ["name": "John","age": 21],
    ["name": "Bob", "age": 35],
    ["name": "Nyan", "age": 20],
    ["name": "Nyan", "age": 20]]

var names = [String]()
var result = [[String:Any]]()

for item in myArray {
    let name = item["name"] as! String
    if !names.contains(name) {
        names.append(name)
        result.append(item)
    }
}

print(result)
Run Code Online (Sandbox Code Playgroud)

而且 - 只是为了好玩 - 使用符合Hashable.

Set从数组中创建一个(使项目唯一),然后从集合中创建一个数组。

struct Person : Hashable { let name : String; let age : Int }

let myArray = [Person(name: "John", age: 21), Person(name: "Bob", age: 35), Person(name: "Nyan", age: 20), Person(name: "Nyan", age: 20)]
let result = Array(Set<Person>(myArray))

print(result)
Run Code Online (Sandbox Code Playgroud)