繁体   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