Как найти сумму для каждой категории в массиве? - PullRequest
0 голосов
/ 19 апреля 2020

У меня есть массив, который содержит несколько элементов. Это массив областей. Он содержит данные в следующей структуре:

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, так что буду очень признателен за совет!

Спасибо!

PS Я планирую сделать то же самое с общими расходами и доходами для расчета итогового баланса.

Ответы [ 2 ]

1 голос
/ 19 апреля 2020

Я думаю, что использовать словарь проще в категоризации, и позже вы можете преобразовать его в массив или что угодно

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)
0 голосов
/ 19 апреля 2020

Я думаю, что вопрос заключается в том, как получить сумму для каждой категории, Доход, Расход и т. Д. c. Если это так, то вот как это делается с помощью функции .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 не является массивом, но имеет некоторый массив -подобные функции. Результаты обновляются в реальном времени, поэтому базовые данные в области изменяются, а результаты изменяются вместе с ними.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...