swiftで多重配列の重複した要素をフィルターしたい


こういった構造のデータの重複（"name"キー）をフィルターしたいのですが  
for文等を使えば済むのは承知しております。  
filter{}を使用して重複を除去したいと思います。  
_重複した["name"]は最初に出現した要素を生きとします。_ （質問者以外のものが付け加えました）

[code]

    var itemList = [
        ["name":"いぬ","no":"0"],
        ["name":"ねこ","no":"1"],
        ["name":"きりん","no":"2"],
        ["name":"ねこ","no":"3"],
        ["name":"らくだ","no":"4"]
    ]
    
[/code]




正直、`filter()`を使って、どれだけプログラムが簡潔になったか、疑問ですが、いちおうこうなりました。

[code]

    let itemList = [
        ["name":"いぬ","no":"0"],
        ["name":"ねこ","no":"1"],
        ["name":"きりん","no":"2"],
        ["name":"ねこ","no":"3"],
        ["name":"らくだ","no":"4"]
    ]
    
    var nameList = [String]()
    let filteredList = itemList.filter({(var member: [String: String]) -> Bool in
        if nameList.contains(member["name"]!) {
            return false
        } else {
            nameList.append(member["name"]!)
            return true
        }
    })
    print(filteredList)
    
[/code]

> [["no": "0", "name": "いぬ"],  
>  ["no": "1", "name": "ねこ"],  
>  ["no": "2", "name": "きりん"],  
>  ["no": "4", "name": "らくだ"]]

「これは循環参照になってるぞ！」など、識者から指摘を受けそうな不安があります。フィルタリングの条件が動的に変化しているので、それが`filter()`関数に適していると、私には思えません。すなおに`for`文を使ったほうが無難と思います。

* * *

一般論でお話ししますと、重複を解消するには、`Set`が有効です。以下、Playgroundで実行してみてください。

[code]

    let nameList = ["きりん", "ねこ", "いぬ", "ねこ", "らくだ"]
    let nameSet = Set(nameList)
    
[/code]

> nameSet // {"きりん", "いぬ", "ねこ", "らくだ"}




正直、`filter()`を使って、どれだけプログラムが簡潔になったか、疑問ですが、いちおうこうなりました。

[code]

    let itemList = [
        ["name":"いぬ","no":"0"],
        ["name":"ねこ","no":"1"],
        ["name":"きりん","no":"2"],
        ["name":"ねこ","no":"3"],
        ["name":"らくだ","no":"4"]
    ]
    
    var nameList = [String]()
    let filteredList = itemList.filter({(var member: [String: String]) -> Bool in
        if nameList.contains(member["name"]!) {
            return false
        } else {
            nameList.append(member["name"]!)
            return true
        }
    })
    print(filteredList)
    
[/code]

> [["no": "0", "name": "いぬ"],  
>  ["no": "1", "name": "ねこ"],  
>  ["no": "2", "name": "きりん"],  
>  ["no": "4", "name": "らくだ"]]

「これは循環参照になってるぞ！」など、識者から指摘を受けそうな不安があります。フィルタリングの条件が動的に変化しているので、それが`filter()`関数に適していると、私には思えません。すなおに`for`文を使ったほうが無難と思います。

* * *

一般論でお話ししますと、重複を解消するには、`Set`が有効です。以下、Playgroundで実行してみてください。

[code]

    let nameList = ["きりん", "ねこ", "いぬ", "ねこ", "らくだ"]
    let nameSet = Set(nameList)
    
[/code]

> nameSet // {"きりん", "いぬ", "ねこ", "らくだ"}

