我想从一系列产品中生成一个购物 list 。 我在核心数据中有一个实体“产品”,其属性为名称(字符串)和金额(整数)。我现在有一系列产品,其中有一些重复项,类似这样:
var products : [Product] = [Apple, Egg, Orange, Apple, Orange, Banana, Egg, Egg]
如何过滤此类数组以获得特定产品的数量总和?我想获得产品列表及其数量,例如:苹果:4、香蕉:3、鸡蛋:7、橙子 2
。我知道我可以从该数组中创建一个集合以避免重复,但我不知道如何在此之前对产品的数量求和。
最佳答案
enum Product {
case Apple
case Egg
case Orange
case Banana
}
let products: [Product] = [.Apple, .Egg, .Orange, .Apple, .Orange, .Banana, .Egg, .Egg]
products.reduce([:]) { (map, product) -> [Product: Int] in
var updatedMap = map
if let value = map[product] {
updatedMap[product] = value + 1
}
else {
updatedMap[product] = 1
}
return updatedMap
} //[Orange: 2, Apple: 2, Egg: 3, Banana: 1]
与字符串相同:
let products: [String] = ["Apple", "Egg", "Orange", "Apple", "Orange", "Banana", "Egg", "Egg"]
products.reduce([:]) { (map, product) -> [String: Int] in
var updatedMap = map
if let value = map[product] {
updatedMap[product] = value + 1
}
else {
updatedMap[product] = 1
}
return updatedMap
} // ["Apple": 2, "Egg": 3, "Orange": 2, "Banana": 1]
或者通过扩展所有可散列序列类型:
extension SequenceType where Generator.Element: Hashable {
func countElements() -> [Generator.Element : Int] {
return reduce([:]) { (map, element) -> [Generator.Element : Int] in
var updatedMap = map
if let value = map[element] {
updatedMap[element] = value + 1
}
else {
updatedMap[element] = 1
}
return updatedMap
}
}
}
products.countElements() //["Apple": 2, "Egg": 3, "Orange": 2, "Banana": 1]
关于ios - 在 Swift 中过滤对象数组并对它们的属性求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38391842/