2

I am trying to sort object of objects obj in javascript on the basis of cummulativeSite in descending order through object.keys but it is not getting sorted.Please suggest a good approach or a method for the same to sort this.

var obj={


 B.E:{
    A: {percentgsite: 8.5, backlogenclsite: 8.5, regularenclsite: 3.5, cummulativeSite: 20.5},
    B: {percentgsite: 5.9, backlogenclsite: 5.9, regularenclsite: 8.5, cummulativeSite: 20.3},
    C: {percentgsite: 5.9, backlogenclsite: 6.4, regularenclsite: 8.9, cummulativeSite: 21.200000000000003}
    },



 Diploma:{
    A: {percentgsite: 8.5, cummulativeSite: 5.2},
    B: {percentgsite: 5.9, cummulativeSite: 8.5},
    C: {percentgsite: 5.9, cummulativeSite: 5.6}
    },



 M.E:{
    A: {percentgsite: 8.5, cummulativeSite: 11.9},
    B: {percentgsite: 5.9, cummulativeSite: 12.9},
    C: {percentgsite: 5.9, cummulativeSite: 13.5}
    }
}

Expected Output :

var obj={


 B.E:{

    C: {percentgsite: 5.9, backlogenclsite: 6.4, regularenclsite: 8.9, cummulativeSite: 21.200000000000003},
    A: {percentgsite: 8.5, backlogenclsite: 8.5, regularenclsite: 3.5, cummulativeSite: 20.5},
    B: {percentgsite: 5.9, backlogenclsite: 5.9, regularenclsite: 8.5, cummulativeSite: 20.3}
    },



 Diploma:{
    B: {percentgsite: 8.5, cummulativeSite: 8.5},
    C: {percentgsite: 5.9, cummulativeSite: 5.6},
    A: {percentgsite: 5.9, cummulativeSite: 5.2}
    },



 M.E:{
    C: {percentgsite: 8.5, cummulativeSite: 13.5},
    B: {percentgsite: 5.9, cummulativeSite: 12.9},
    A: {percentgsite: 5.9, cummulativeSite: 11.9}
    }
}
Kris
  • 17
  • 1
  • 5

2 Answers2

1

As you mentioned in comments you're ok to change B.E and so on to array ( Because object doesn't guaranty order ). So i will change them in array and than sort them based on cummulativeSite property

var obj={'B.E':[{A:{percentgsite:8.5,backlogenclsite:8.5,regularenclsite:3.5,cummulativeSite:20.5}},{B:{percentgsite:5.9,backlogenclsite:5.9,regularenclsite:8.5,cummulativeSite:20.3}},{C:{percentgsite:5.9,backlogenclsite:6.4,regularenclsite:8.9,cummulativeSite:21.200000000000003}}],Diploma:[{A:{percentgsite:8.5,cummulativeSite:5.2}},{B:{percentgsite:5.9,cummulativeSite:8.5}},{C:{percentgsite:5.9,cummulativeSite:5.6}}],'M.E':[{A:{percentgsite:8.5,cummulativeSite:11.9}},{B:{percentgsite:5.9,cummulativeSite:12.9}},{C:{percentgsite:5.9,cummulativeSite:13.5}}]}

Object.keys(obj).forEach(e => {
  obj[e].sort( (a,b) =>{
   return Object.values(a)[0].cummulativeSite -
   Object.values(b)[0].cummulativeSite
   })
})

console.log(obj)
Code Maniac
  • 37,143
  • 5
  • 39
  • 60
  • var obj={ B.E:[ 0:{ A: {percentgsite: 8.5, backlogenclsite: 8.5, regularenclsite: 3.5, cummulativeSite: 20.5}, B: {percentgsite: 5.9, backlogenclsite: 5.9, regularenclsite: 8.5, cummulativeSite: 20.3}; C: {percentgsite: 5.9, backlogenclsite: 6.4, regularenclsite: 8.9, cummulativeSite: 21.200000000000003} } ], @Code Maniac i am getting my B.E array in this format. Can you please suggest sorting now – Kris Feb 03 '19 at 13:31
  • @Kris your posted one doesn't seems to be valid one `{ B.E: [ 0:` – Code Maniac Feb 03 '19 at 16:19
  • this 0 is the index at which array is present @Code Maniac – Kris Feb 03 '19 at 17:47
0

You could use a nested Object.entries and reduce like this:

var obj={"B.E":{A:{percentgsite:8.5,backlogenclsite:8.5,regularenclsite:3.5,cummulativeSite:20.5},B:{percentgsite:5.9,backlogenclsite:5.9,regularenclsite:8.5,cummulativeSite:20.3},C:{percentgsite:5.9,backlogenclsite:6.4,regularenclsite:8.9,cummulativeSite:21.200000000000003}},"Diploma":{A:{percentgsite:8.5,cummulativeSite:5.2},B:{percentgsite:5.9,cummulativeSite:8.5},C:{percentgsite:5.9,cummulativeSite:5.6}},"M.E":{A:{percentgsite:8.5,cummulativeSite:11.9},B:{percentgsite:5.9,cummulativeSite:12.9},C:{percentgsite:5.9,cummulativeSite:13.5}}}

const sortedObj = Object.entries(obj).reduce((acc, [dept, v]) =>{
  const sortedDept = Object.entries(v)
             .sort(([k1,v1], [k2,v2]) => v2.cummulativeSite - v1.cummulativeSite)
             .reduce((r, [k,v]) => (r[k] = v, r), {});
  
  acc[dept] = sortedDept;
  return acc;
}, {})

console.log(sortedObj)

Forgot to mention that, properties order in objects is not guaranteed in JavaScript, especially if you have integer keys. If you decide to change the inner items to an array, you get the idea.

adiga
  • 34,372
  • 9
  • 61
  • 83
  • if i take B.E, Diploma and M.E as an array inside this object will that suffice @adiga – Kris Feb 01 '19 at 11:38
  • @Kris how are you planning on converting "B.E" to an array? Will the structure be `"B.E": [ { "A": { percentgsite } }, { "B": { percentgsite } } ]` OR `"B.E": [ { percentgsite}, { percentgsite} ]` – adiga Feb 01 '19 at 12:19
  • this is the format when i change it into array can i implement the way you suggested to get the sorting done in this case.. @adiga – Kris Feb 03 '19 at 11:42
  • var obj={ B.E:[ 0:{ A: {percentgsite: 8.5, backlogenclsite: 8.5, regularenclsite: 3.5, cummulativeSite: 20.5}, B: {percentgsite: 5.9, backlogenclsite: 5.9, regularenclsite: 8.5, cummulativeSite: 20.3}; C: {percentgsite: 5.9, backlogenclsite: 6.4, regularenclsite: 8.9, cummulativeSite: 21.200000000000003} } ], @adiga – Kris Feb 03 '19 at 11:43