簡體   English   中英

如何根據數組內部的特定值將一個數組過濾成多個數組?

[英]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)
  }

您可以嘗試這樣的方法,以獲取帶有Placesadresses字典。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM