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.

5
  • 1
    You cannot sort an object. What exactly do you expect as the result? Commented Jul 20, 2020 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" ? Commented Jul 20, 2020 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? Commented Jul 20, 2020 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! Commented Jul 20, 2020 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. Commented Jul 20, 2020 at 22:12

1 Answer 1

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)

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.