mr_Iurii
@mr_Iurii
Искатель

Как преобразовать массив realm в многомерный динамический?

Есть массив получаемый из бд realm:
var spendingArray: Results<Spending>!

Структура таблицы Spending в бд realm:
class Spending: Object {
    
    @objc dynamic var category = ""
    @objc dynamic var sum: Int = 1
    @objc dynamic var day : Int = 1


Как преобразовать его в многомерный массив типа:
[массив] = [массив дней[массив день1 [массивы категорий, массивы суммы]]]

При том, что дни могут повторятся.
  • Вопрос задан
  • 64 просмотра
Пригласить эксперта
Ответы на вопрос 1
briahas
@briahas
ObjC, Swift, Python
пробуйте, в онлайн плейграунде вроде норм отработало.
Можете поиграться с инитом DaySection - вместо cell передавать сразу массив (если вам так удобнее).
Ну, и если это не то что вам надо - уточняйте.
spoiler
import Foundation

class Spending {
    let category: String
    let sum: Int
    let day: Int

    init(category: String, sum: Int, day: Int) {
        self.category = category
        self.sum = sum
        self.day = day
    }
}

struct CellData {
  let category: String
  let sum: Int
}
class DaySection {
    var cells = [CellData]()
    let day: Int

    init(day: Int, cell: CellData) {
        self.cells.append(cell)
        self.day = day
    }
}

var destArr = [DaySection]()
var sourceArr = [Spending]()
sourceArr.append(Spending(category:"1", sum:1, day:1))
sourceArr.append(Spending(category:"2", sum:2, day:1))
sourceArr.append(Spending(category:"1", sum:1, day:2))
sourceArr.append(Spending(category:"2", sum:2, day:2))
sourceArr.append(Spending(category:"1", sum:1, day:3))

destArr = sourceArr.reduce([DaySection](), { (aggr, elem) in
  let newCell = CellData(category: elem.category, sum: elem.sum)
  guard let day = aggr.first(where: {$0.day == elem.day}) 
      else {
        var temp = aggr
        let newDaySection = DaySection(day: elem.day, cell: newCell)
        temp.append(newDaySection)
        return temp
      }
  
  day.cells.append(newCell)
  return aggr
})
</spoiler>
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы