【问题标题】:How to find sum for each category in an array?如何找到数组中每个类别的总和?
【发布时间】:2020-04-19 10:10:09
【问题描述】:

我有一个包含多个项目的数组。这是一个领域数组。它包含以下结构的数据:

Results<Entry> <0x7ff04840e1a0> (
    [0] Entry {
        name = Salary;
        amount = 40000;
        date = 2020-03-18 16:00:00 +0000;
        category = Main Incomes;
        entryType = Income;
    },
    [1] Entry {
        name = Diff;
        amount = -500;
        date = 2020-04-18 16:00:00 +0000;
        category = Misc;
        entryType = Expense;
    },
    [2] Entry {
        name = Cat Food;
        amount = -399;
        date = 2020-04-18 16:00:00 +0000;
        category = Animals;
        entryType = Expense;
    },
    [3] Entry {
        name = Fish Food;
        amount = -599;
        date = 2020-04-18 16:00:00 +0000;
        category = Animals;
        entryType = Expense;
    }
)

我想要实现的是创建另一个数组来“透视”每个类别的总数。所以它可以作为 Excel 中的数据透视表。

所需的输出是一个包含每个类别总数的数组:

[0] X-Array {
        category = Main Incomes;
        amount = XXXX;
    },
    [1] X-Array {
        category = Animals;
        amount = XXXX;

And so on...

我对 .map.reduce 等花哨的单行代码以及其他 Swift 的数组管理糖还很陌生,因此非常感谢您的建议!

谢谢!

附注我计划对总支出和收入做同样的事情,以计算期末余额。

【问题讨论】:

  • 看一下文档,Results 有一些聚合函数,为什么不用呢? Realm Aggregate Operations
  • 这不是一个数组,它是一个 Realm 结果对象,虽然它们相似但有一些明显的区别。此外,问题是一个但不清楚 - 你想要每个条目类型的总数吗?例如收入 = 4000,费用 = 500+399+599?还是您在寻找其他东西?最后,这不是代码编写服务——请展示您尝试过的代码并指出您坚持的内容。请查看How to create a Minimal, Complete, and Verifiable example

标签: ios arrays swift realm


【解决方案1】:

我认为使用 Dictionary 更容易进行分类,稍后您可以将其转换为数组或任何您想要的内容

var dict:[String:Double] = [:]

list.forEach {
    if let current = dict[$0.category]{
        dict[$0.category] = current + $0.amount
    }else{
        dict[$0.category] = $0.amount
    }
}

print(dict)

【讨论】:

    【解决方案2】:

    我认为问题是询问如何获得每个类别、收入、费用等的总和。如果是这样,以下是使用结果中的 .sum 函数的方法。

    let totalIncome = realm.objects(AccountClass.self)
                           .filter("entryType == 'Income'")
                           .sum(ofProperty: "amount") as Int
    let totalExpense = realm.objects(AccountClass.self)
                            .filter("entryType == 'Expense'")
                            .sum(ofProperty: "amount") as Int
    
    print("Total Income: \(totalIncome)")
    print("Total Expense: \(totalExpense)")
    

    您的示例数据的输出是

    Total Income: 40000
    Total Expense: 1498
    

    如果您想要一个数据透视表,您可以将金额添加到一个数组中 - 如果您需要标签,请使用元组将它们存储在这样的数组中

    let i = ("Income", totalIncome)
    let e = ("Expense", totalExpense)
    
    let tupleArray = [i, e]
    
    for account in tupleArray {
       print(account.0, account.1)
    }
    

    请记住,Results 对象不是数组,而是具有一些类似数组的函数。结果是实时更新的,因此 Realm 中的基础数据发生变化,结果也会随之变化。

    【讨论】:

      猜你喜欢
      • 2021-10-07
      • 2022-11-29
      • 1970-01-01
      • 2020-05-26
      • 1970-01-01
      • 2016-07-07
      • 2010-11-16
      • 1970-01-01
      相关资源
      最近更新 更多