Фильтрация с помощью .map, .filter?

ios

#1

привет всем, пытаюсь создать sections (по годам) в tableView и без фильтрации никак…
Хотелось бы сделать красиво при помощи map и filter.
Но там где стаит статически “2019” хотелось бы подставить “allYears”.
Заранее всем благодарен :wink:

struct Person {
    let name: String
    let address: String
    let age: Int
    let income: Double
    let cars: [String]
    let date: String
}
let peopleArray = [ Person(name:"Santosh", address: "Pune, India", age:34, income: 100000.0, cars:["i20","Swift VXI"], date: "2019-04-12"),
                Person(name: "John", address:"New York, US", age: 23, income: 150000.0, cars:["Crita", "Swift VXI"], date: "2018-11-30"),
                Person(name:"Amit", address:"Nagpure, India", age:17, income: 200000.0, cars:Array(), date: "2019-07-24") ]

let sectionItems: [String:[Person]] = [:]

let allYears =  peopleArray.map({$0.date.prefix(4)}) // ["2019", "2018", "2019"]
let filtredSections = peopleArray.filter({ String( $0.date.prefix(4) ) == "2019" }) // "2019" with allYears ???
print(filtredSections.map {$0.date}) // ["2019-04-12", "2019-07-24"]

#2
let allYears =  peopleArray.map({$0.date.prefix(4)}) // ["2019", "2018", "2019"]
let filtredSections = allYears.map { $0 == "2019" ? "allYears" : $0 } // ["allYears", "2018", "allYears"]

Устроит такой вариант?

Видимо я не заметил с каким массивом работает фильтрация. Вам нужно именно в самом объекте заменить дату на allYears?


#3

да, именно так, allYear - это переменная, должно примерно так выглядеть:

self.sectionItems = ...
["2019":[соответствующий массив где года равны 2019]]
["2018":[соответствующий массив где года равны 2018]] 

итд


#4

а года для чего заменять на allYears?


#5

allYear - это переменная, но не строка, вы правильно себя поправили.
я это как пример поставил, чтоб найти префикс во всех датах


#6

Напиши пример результата. В каком формате и хотя бы пару строк со значениями.


#7

мне главное собрать:

var sectionItems: [String:[Person]] = [:]

пример результата закомментированы справой стороны переменных(в самом начале)
пониже так-же отписал что никак не выведу:

self.sectionItems = ...
["2019":[соответствующий массив где года равны 2019]]
["2018":[соответствующий массив где года равны 2018]]

надеюсь я правильно понял суть вопроса? :grinning:


#8

Проверяйте

let sectionItems = Dictionary(grouping: peopleArray, by: { String($0.date.prefix(4)) })


#9

Вот, то, что нужно!
Так и хотелось, коротко и без ненужных итераций.
Примного благодарен!