2016-07-18 7 views
4

辞書[String: [Object]]があります。各オブジェクトには.name値が配列のフィルタ辞書

辞書には.filterを使用して、フィルタリングされた値を含むキーのみで辞書を返すことはできますか?

答えて

6

を私はあなたの質問を理解していれば、あなたは各Objectnameプロパティおよびこれを持っている[String: [Object]]辞書のキーをしたいですプロパティには指定された値があります。 flatMapcontainsfilter

let filteredKeys = dict.filter { (key, value) in value.contains({ $0.name == "two" }) }.map { $0.0 } 

print(filteredKeys) 

ソリューションと

ソリューション:さて、あなたは、オブジェクトがその名前に "2" を持っている辞書のキーにしたいとしましょう

struct Obj { 
    let name: String 
} 

let o1 = Obj(name: "one") 
let o2 = Obj(name: "two") 
let o3 = Obj(name: "three") 

let dict = ["a": [o1, o2], "b": [o3]] 

let filteredKeys = dict.flatMap { (str, arr) -> String? in 
    if arr.contains({ $0.name == "two" }) { 
     return str 
    } 
    return nil 
} 

print(filteredKeys) 

ループを備えたソリューション

var filteredKeys = [String]() 

for (key, value) in dict { 
    if value.contains({ $0.name == "two" }) { 
     filteredKeys.append(key) 
    } 
} 

print(filteredKeys) 
+0

それは本当に素晴らしい完璧な答えです!どうもありがとう! –

+0

あなたは大歓迎です! :) ありがとう。 – Moritz

2

はい、しかし、あなたが値として配列で辞書を得たので:

+0

ありがとう!私は検索文字列filteredCityStations.filter({$ 0.1.filter({$ 0.タイトルを!])でフィルターしようとしましたが、私の型がBoolに変換できないと訴えています。 –

+0

@AlexeyK、EricDが正しいです。最初のフィルタはflatMapでなければなりません。答えを編集しました。 –

関連する問題