ios - 在 Swift 中过滤对象数组并对它们的属性求和

标签 ios arrays swift core-data

我想从一系列产品中生成一个购物 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/

相关文章:

ios - 将出现的 NSString 替换为 NSTextAttachment

ios - string 转换成数组 Ios ,通过 webservices 获取

ios - 没有服务的 BLE 设备的三个 UUID,这可能吗?

iphone - 框架代码将消息发送到已释放的 UITableViewController 对象的错误

ios - 定位 ARKIT 模型

json - 如何将 Swift 对象序列化或转换为 JSON?

swift - 给 adjustsFontSizeToFitWidth 间距

PHP 向原始 foreach 数组添加值以使其继续运行

java - 在查询生成器中使用子字符串操作字符串

php - 将一个 php 数组分成两个