2

So I have this array that contains objects:

var terms = [
 {
  'class-1': {name: 'English', completed: '12/02/19', letterGrade: 'A'}, 
  'class-2': {name: 'Math', completed: '12/02/19', letterGrade: 'A'},
  'class-3': {name: 'P.E.', completed: '12/02/19', letterGrade: 'A'},
  'class-4': {name: 'World History', completed: '12/02/19', letterGrade: 'A'}
 },
 {
  'class-1': {name: 'P.E.', completed: '12/02/19', letterGrade: 'A'},
  'class-2': {name: 'World History', completed: '12/02/19', letterGrade: 'A'},
 },
 {
  'class-1': {name: 'P.E.', completed: '12/02/19', letterGrade: 'A'},
  'class-2': {name: 'English', completed: '12/02/19', letterGrade: 'A'},
  'class-3': {name: 'Math', completed: '12/02/19', letterGrade: 'A'},
 },
 {
  'class-1': {name: 'English', completed: '12/02/19', letterGrade: 'A'},
  'class-2': {name: 'Algebra', completed: '12/02/19', letterGrade: 'A'},
  'class-3': {name: 'Psychology', completed: '12/02/19', letterGrade: 'A'},
 }
]

And I want to sort each of the nested objects alphabetically on the name of the class. But I want the whole array to be sorted.

Not sure how I should go about doing this. What's holding me up is the amount of nests in the data.

KyleMit
  • 30,350
  • 66
  • 462
  • 664
reid poynter
  • 41
  • 1
  • 6
  • 1
    You cannot sort an object. What exactly do you expect as the result? – Bergi Jul 20 '20 at 21:06
  • 1
    Two comas are missing after class-2 and class-3 generation. But what you mean that "I want the whole array to be sorted" ? – iguypouf Jul 20 '20 at 21:07
  • I'm expecting the result to be sorted by class-#.name So for example, terms[3] would be class-2 first then class-3 then class-1. make sense? – reid poynter Jul 20 '20 at 21:12
  • @reidpoynter, can you update your question with the desired output in terms of JS - also might help to describe what you have tried so far on your end? Thanks! – KyleMit Jul 20 '20 at 21:13
  • No it doesn’t make sense because you can’t sort objects. Perhaps you meant to have the four objects in the `terms` array be arrays themselves, moving that “class-1” thing inside each inner object as “classId” property. – James Jul 20 '20 at 22:12

1 Answers1

1

Given the following input:

let classes = {
  'class-1': {name: 'P.E.', completed: '12/02/19', letterGrade: 'A'},
  'class-2': {name: 'English', completed: '12/02/19', letterGrade: 'A'},
  'class-3': {name: 'Math', completed: '12/02/19', letterGrade: 'A'},
}

You can separate each key/value pair into entries, sort those entries however you wish, and then re-assign to an object, like this:

let allEntries = Object.entries(classes)
let sortedEntries = allEntries.sort((a,b) => a[1].name.localeCompare(b[1].name))
let obj = Object.fromEntries(sortedEntries)

Which will produce the following result:

{
  'class-2': {name: 'English', completed: '12/02/19', letterGrade: 'A'},
  'class-3': {name: 'Math', completed: '12/02/19', letterGrade: 'A'},
  'class-1': {name: 'P.E.', completed: '12/02/19', letterGrade: 'A'}
}

Although do note that insertion order is not deterministic for js object properties

Demo in Stack Snippets

let classes = {
  'class-1': {name: 'P.E.', completed: '12/02/19', letterGrade: 'A'},
  'class-2': {name: 'English', completed: '12/02/19', letterGrade: 'A'},
  'class-3': {name: 'Math', completed: '12/02/19', letterGrade: 'A'},
}

let allEntries = Object.entries(classes)
let sortedEntries = allEntries.sort((a,b) => a[1].name.localeCompare(b[1].name))
let obj = Object.fromEntries(sortedEntries)

console.log(obj)
KyleMit
  • 30,350
  • 66
  • 462
  • 664