あなたはfilter(_:)を使用することによって、これを達成することができます:
は、順番に、与えられた述語を満たすシーケンス の要素を含む配列を返します。例えば
、構造がどのように見えることを考慮してください。
struct Model {
var name: String?
}
そして、あなたは、モデルの配列を持っている:
let allModelsArray = [Model(name: "abc"), Model(name: "efg"), Model(name: "hij"), Model(name: "abc"), Model(name: "efg"), Model(name: "efg"), Model(name: "hij")]
だから、あなたがいることを想定して(実行して、配列を得ることができますname
の値に基づいてフィルタリングする必要があります)。
let abcModelsArray = allModelsArray.filter { $0.name == "abc" }
// [Model(name: Optional("abc")), Model(name: Optional("abc"))]
let hijModelsArray = allModelsArray.filter { $0.name == "hij" }
// [Model(name: Optional("hij")), Model(name: Optional("hij"))]
ALSO
:
あなたがいることを述べた:
は、どのように私は、このような新しい配列にMODELAとmodelDを入れて、入れて、新しい 配列に同じプロパティ値を持つ要素を入れることができますmodelB とモデルEを新しい配列に追加すると、の場合はとなります。
どうにかして、コレクションのバージョンlazyを使用したい場合があります。
これが役に立った。
let a = [modelA, modelB, modelC, modelD, modelE]
let arr = a.reduce([:]) { (result, currentModel) -> [String: [Model]] in
var mutableDic = result
if ((mutableDic[currentModel.name]) != nil) {
mutableDic[currentModel.name]?.append(currentModel)
} else {
mutableDic[currentModel.name] = [currentModel]
}
return mutableDic
}
それは@Grimxn応答と同じ辞書を返します。
'var d [String:[Model]];で何が問題になるでしょうか。私は配列の中で{let m = array.filter {$ 0.name == i.name}; if m.count> 1 {d [i.name] = m}} '? – Grimxn
http://stackoverflow.com/questions/31220002/how-to-group-by-the-elements-of-an-array-in-swiftこれは私の質問を解決します、皆のためにありがとう – Tom