I have this object:
gladiators = { Pesho: { Duck: '400' }, Gladius: { Heal: '200', Support: '250', Shield: '250' } }
Each gladiator has its own abilities and as values are the skill for each ability, I want to print them in desecending order by total skill, this is where I am at the moment:
for (let element in gladiators){ console.log(`${element}: ${Object.values(gladiators[element]).map(Number).reduce((a, b) => a + b, 0)} skill`); for (let el in gladiators[element]){ console.log(`- ${el} <!> ${gladiators[element][el]}`) } }
this code prints:
Pesho: 400 skill - Duck <!> 400 Gladius: 700 skill - Heal <!> 200 - Support <!> 250 - Shield <!> 250
I simply want it to print:
Gladius: 700 skill - Shield <!> 250 - Support <!> 250 - Heal <!> 200 Pesho: 400 skill - Duck <!> 400
I want the total skill to be in descending order, if its equal, sort in ascending order, the same for each ability the gladiator has. Please suggest me how can I make my question more clear if I have mistakes I read the guide a few times.
Advertisement
Answer
We should be able to use Object.entries and Array.sort to arrange the objects as we wish, then print out the results:
gladiators = { Pesho: { Duck: '400' }, Gladius: { Heal: '200', Support: '250', Shield: '250' } } // Get our array of gladiators, add total skill and add sorted abilities array. let result = Object.entries(gladiators).map(([name, glad]) => { let abilities = Object.entries(glad); return { name, Total: abilities.reduce((acc, [k,v]) => acc + Number(v) , 0), abilities: abilities.sort(([k1,v1], [k2,v2]) => v2 - v1) }; }); // Sort the result in descending order by total skill. result.sort((a,b) => b.Total - a.Total); // Print out our result. result.forEach(res => { console.log(`${res.name}: ${res.Total} skill`) res.abilities.forEach(([k,v]) => console.log(` - ${k} <!>`,v)); })