[英]How to filter one array into multiple arrays depending on a specific value inside of the array?
我正在嘗試根據地點的城市、州(我已標記為地址)將地點數組過濾成多個數組。 我希望將具有相同地址的所有地點對象分組到一個數組中,這樣我就可以將該地址用作 tableView 中每個部分的標題。 我只是不知道該怎么做。 我不知道如何為此顯示任何代碼,但我嘗試filteredPlaces.append(places.filter({ $0.address }))
這根本不起作用。
我試圖遍歷places
數組,但我不確定我需要什么代碼來識別是否有任何對象具有相同的地址。
我當前的filteredPlaces
數組如下所示: var filteredPlaces = [[Place]()]
和當前包含所有位置的數組如下所示: var places = [Place]()
如何根據一個數組中每個位置的地址創建單獨的數組?
這是我的地方對象類
class Place {
var name: String
var street: String
var city: String
var state: String
var zip: String
var drinks: [Drink]
var address: String {
return "\(city), \(state)"
}
init(name: String, street: String, city: String, state: String, zip: String, drinks: [Drink]) {
self.name = name.uppercased()
self.street = street.uppercased()
self.city = city.uppercased()
self.state = state.uppercased()
self.drinks = drinks
self.zip = zip
}
convenience init(name: String, street: String, city: String, state: String, zip: String, drinks: [Drink]?) {
if drinks != nil {
self.init(name: name, street: street, city: city, state: state, zip: zip, drinks: drinks)
} else {
self.init(name: name, street: street, city: city, state: state, zip: zip, drinks: [Drink]())
}
}
}
我還沒有創建聲明,因為這將在用戶輸入新 viewController 上的位置時完成。
您可以使用Dictionary(grouping:by:)
這個例子就像
/// let students = ["Kofi", "Abena", "Efua", "Kweku", "Akosua"]
/// let studentsByLetter = Dictionary(grouping: students, by: { $0.first! })
/// // ["E": ["Efua"], "K": ["Kofi", "Kweku"], "A": ["Abena", "Akosua"]]
在您的情況下,您需要一些可散列的字典鍵,因此一對可散列的地點和街道名稱:
struct PlaceNameStreet: Hashable {
let name: String
let street: String
}
let dictionary = Dictionary(grouping: places) { place in
PlaceNameStreet(name: place.name, street: place.street)
}
您可以嘗試這樣的方法,以獲取帶有Places
的adresses
字典。
EDIT-1:使用您的Place
課程。
// example Places, 2 in Tokyo, and 3 in Sydney
var places = [
Place(name: "place-1", street: "street-1", city: "Tokyo", state: "Kanto", zip: "123", drinks: []),
Place(name: "place-2", street: "street-2", city: "Tokyo", state: "Kanto", zip: "123", drinks: []),
Place(name: "place-1", street: "street-1", city: "Sydney", state: "NSW", zip: "123", drinks: []),
Place(name: "place-2", street: "street-2", city: "Sydney", state: "NSW", zip: "123", drinks: []),
Place(name: "place-3", street: "street-3", city: "Sydney", state: "NSW", zip: "123", drinks: [])]
// just for info
let adrss = Set(places.map{$0.address})
print("\n---> unique adresses: \(adrss) \n")
// returns a dictionary where the key is the address and the value are the Places
let allPlaces: [String:[Place]] = Set(places.map{$0.address}).reduce(into: [:]) { dict, adrs in
dict[adrs] = places.filter{$0.address == adrs}
}
// an array of all places in Sydney
print("\n---> all Places in Sydney: \(allPlaces["SYDNEY, NSW"]) \n")
// an array of all places in Tokyo
print("\n---> all Places in Tokyo: \(allPlaces["TOKYO, KANTO"]) \n")
術語Set(places.map{$0.address})
為您提供所有唯一地址。 .reduce(into: [:])
,累積每個地址的Places
。 結果是一個字典,key=地址,value= Place
的數組
示例用法:
struct ContentView: View {
@State var allPlaces: [String:[Place]] = [:]
var body: some View {
List {
ForEach(allPlaces.keys.sorted(), id: \.self) { key in
Section(header: Text(key)) {
ForEach(allPlaces[key] ?? []) { place in
Text(place.name)
}
}
}
}
.onAppear {
// example Places, 2 in Tokyo, and 3 in Sydney
var places = [
Place(name: "place-1", street: "street-1", city: "Tokyo", state: "Kanto", zip: "123", drinks: []),
Place(name: "place-2", street: "street-2", city: "Tokyo", state: "Kanto", zip: "123", drinks: []),
Place(name: "place-1", street: "street-1", city: "Sydney", state: "NSW", zip: "123", drinks: []),
Place(name: "place-2", street: "street-2", city: "Sydney", state: "NSW", zip: "123", drinks: []),
Place(name: "place-3", street: "street-3", city: "Sydney", state: "NSW", zip: "123", drinks: [])]
// returns a dictionary where the key is the address and the value are the Places
allPlaces = Set(places.map{$0.address}).reduce(into: [:]) { dict, adrs in
dict[adrs] = places.filter{$0.address == adrs}
}
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.