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

投稿者: Anonymous

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

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

解決

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

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)

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

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


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

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

nameSet // {“きりん”, “いぬ”, “ねこ”, “らくだ”}

回答者: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *