Reputation: 81
jI have an array of objects with children objects.
I want to sort my array into an array of arrays based on the children objects
For instance: Array of
[employee, employee, employee, employee]
now what I want to do is sort this like this ->
[[employee.job.jobName = "baker",employee.job.jobName = "baker"],
[employee.job.jobName = "sweeper",employee.job.jobName = "sweeper"]]
The goal is to create a tableview where the section heading groups the employees where their job.jobName is the same. and the rows will be made up of those employees, their names etc. In order to do this, I need an array of unique job.jobNames for employees that make up the section count and then the array of employees within each section make up the row count.
I have tried using array.map and array.filter but I think I need a combination and I can't seem to work my head around this one. Any help would be greatly appreciated!
Upvotes: 0
Views: 1303
Reputation: 2710
import UIKit
/*Data Structure for Employee*/
class Employee:NSObject{
/*Unemployed for default*/
var job:String = "unemployed"
init(job:String){
self.job = job
}
override var description: String {
return self.job
}
}
/**Returns the array of arrays of enmployees sorted by jobs*/
func sortEmployees(employees:[Employee])->[[Employee]]
{
//Sorting them by job
let sorted = employees.sort({$0.job < $1.job})
//Empty array of arrays
var sortedEmployees = [[Employee]]()
//job key
var currentKey = ""
for emp in sorted{
let tempKey = emp.job
//first element - edge case
if sortedEmployees.count == 0
{
currentKey = tempKey
sortedEmployees.append([emp])
}
else{
if tempKey != currentKey{
//create a new object
sortedEmployees.append([emp])
currentKey = tempKey
}
else{
//get last array
if let lastArray = sortedEmployees.last{
var tempLast = lastArray
tempLast.append(emp)
sortedEmployees.removeLast()
sortedEmployees.append(tempLast)
}
}
}
}
print(sortedEmployees)
return sortedEmployees
}
/**Sample iVars*/
let emp1 = Employee(job: "baker")
let emp2 = Employee(job: "baker")
let emp3 = Employee(job: "sweeper")
let emp4 = Employee(job: "sweeper")
//Array with all of them
let array = [emp1, emp2, emp3, emp4]
let result = sortEmployees(array)
print(result)
Upvotes: 0
Reputation: 3863
Here is my take on how I would split your employee array into an array of arrays.
// Just needed to make the example work
struct Job {
var name: String
}
struct Employee {
var job: Job
}
/////////////////////////////////////////
let employees = [Employee(job: Job(name: "baker")), Employee(job: Job(name: "sweeper")), Employee(job: Job(name: "baker")), Employee(job: Job(name: "sweeper"))]
var jobs = Set<String>()
employees.forEach { jobs.insert($0.job.name) }
let sortedJobs = jobs.sort()
var groupedEmployees = [[Employee]]()
for jobName in sortedJobs {
groupedEmployees.append(employees.filter({ $0.job.name == jobName }))
}
print(groupedEmployees)
It produces the desired output of:
[[main.Employee(job: main.Job(name: "baker")), main.Employee(job: main.Job(name: "baker"))], [main.Employee(job: main.Job(name: "sweeper")), main.Employee(job: main.Job(name: "sweeper"))]]
Upvotes: 1