对象的值按降序排列

我有这个对象:


gladiators = {

  Pesho: { Duck: '400' },

  Gladius: { Heal: '200', Support: '250', Shield: '250' }

}

每个角斗士都有自己的能力,因为值是每个能力的技能,我想按总技能降序打印它们,这就是我现在的位置:


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]}`)

        }

    }

此代码打印:


Pesho: 400 skill

- Duck <!> 400

Gladius: 700 skill

- Heal <!> 200

- Support <!> 250

- Shield <!> 250

我只是想让它打印:


Gladius: 700 skill

- Shield <!> 250

- Support <!> 250

- Heal <!> 200

Pesho: 400 skill

- Duck <!> 400


我希望总技能按降序排列,如果相等,则按升序排列,角斗士拥有的每种技能都相同。如果我读了几次指南有错误,请建议我如何使我的问题更清楚。


慕森卡
浏览 111回答 4
4回答

叮当猫咪

我们应该能够使用 Object.entries 和 Array.sort 按照我们的意愿排列对象,然后打印出结果:gladiators = {&nbsp; Pesho: { Duck: '400' },&nbsp; 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]) => {&nbsp;&nbsp; &nbsp; let abilities = Object.entries(glad);&nbsp; &nbsp; 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 => {&nbsp;&nbsp; &nbsp; console.log(`${res.name}: ${res.Total} skill`)&nbsp; &nbsp; res.abilities.forEach(([k,v]) => console.log(` - ${k} <!>`,v));})

尚方宝剑之说

我会把你的计算分成一个单独的数组,并在你输出之前对这个新数组进行排序。例如:const gladiators = {&nbsp; Pesho: { Duck: '400' },&nbsp; Gladius: { Heal: '200', Support: '250', Shield: '250' }}const valueDescNameAsc = (a, b) => {&nbsp; if (a.value === b.value) return a.name.localeCompare(b.name)&nbsp; return a.value > b.value ? -1 : 1}// Transform data into arrays of objects (and calculate top-level value)const gladiatorSkills = Object.entries(gladiators)&nbsp; .map(([name, skills]) => ({&nbsp; &nbsp; name,&nbsp; &nbsp; value: Object.values(skills).map(Number).reduce((a, b) => a + b, 0),&nbsp; &nbsp; skills: Object.entries(skills).map(([name, value]) => ({ name, value })).sort(valueDescNameAsc)&nbsp; }))&nbsp; .sort(valueDescNameAsc)// Output the transformed gladiatorSkills datafor (let { name, value, skills } of gladiatorSkills) {&nbsp; console.log(`${name}: ${value} skill`)&nbsp; for (let { name, value } of skills) {&nbsp; &nbsp; console.log(`- ${name} <!> ${value}`)&nbsp; }}

哆啦的时光机

对象不是按照顺序构建的。这是数组的工作。查看您的数据,拥有一个可以使用数组方法(例如排序)进行操作的角斗士列表会更合适。因此,在下面的示例中,我将您的数据重写为一个对象数组,其中包含嵌套数组。这将保证订单将得到兑现。它还将使代码的操作不那么复杂,因为您只是在处理数组,不需要转换。map,reduce和的组合 sort将带您到达您需要去的地方。const gladiators = [&nbsp; {&nbsp; &nbsp; name: 'Pesho',&nbsp; &nbsp; stats: [&nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; name: 'Duck',&nbsp; &nbsp; &nbsp; &nbsp; value: 400&nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; ],&nbsp; },&nbsp; {&nbsp; &nbsp; name: 'Gladius',&nbsp; &nbsp; stats: [&nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; name: 'Heal',&nbsp; &nbsp; &nbsp; &nbsp; value: 200&nbsp; &nbsp; &nbsp; },&nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; name: 'Support',&nbsp; &nbsp; &nbsp; &nbsp; value: 300&nbsp; &nbsp; &nbsp; },&nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; name: 'Shield',&nbsp; &nbsp; &nbsp; &nbsp; value: 250&nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; ],&nbsp; },];gladiators&nbsp; /**&nbsp; &nbsp;* Calculate the total skill and&nbsp; &nbsp;* sort the skills based on their value.&nbsp; &nbsp;*/&nbsp; .map(({ name, stats }) => {&nbsp; &nbsp; const skill = stats.reduce((acc, { value }) => acc + value, 0);&nbsp; &nbsp; const sortedStats = stats.sort((a, b) => b.value - a.value);&nbsp; &nbsp; return { name, skill, stats: sortedStats };&nbsp; })&nbsp;&nbsp;&nbsp; /**&nbsp; &nbsp;* Sort the gladiators by skill (desc)&nbsp; &nbsp;*/&nbsp; .sort((a, b) => b.skill - a.skill)&nbsp;&nbsp;&nbsp; /**&nbsp; &nbsp;* Print the data&nbsp; &nbsp;*/&nbsp; .forEach((gladiator) => {&nbsp; &nbsp; console.log(`${gladiator.name}: ${gladiator.skill}`)&nbsp; &nbsp; gladiator.stats.forEach(({ name, value }) => {&nbsp; &nbsp; &nbsp; console.log(`- ${name} <!> ${value}`);&nbsp; &nbsp; });&nbsp; });

繁花如伊

我会通过创建一个新列表来简化这个问题,以总技能水平为索引,然后对该列表进行排序,并记录每个条目;注意:这段代码可以进一步简化,但我已经这样发布了,所以步骤对 OP 来说很清楚;// Original dataconst data = { Pesho: { Duck: '400' }, Gladius: { Heal: '200', Support: '250', Shield: '250' } };// Index each gladiator on total skilllet indexOnTotal = {};for (let obj of Object.entries(data)) {&nbsp;&nbsp;&nbsp; &nbsp; // Get obj value's&nbsp; &nbsp; const [name, skills] = obj;&nbsp;&nbsp;&nbsp; &nbsp; // Total Skill count&nbsp; &nbsp; const total = Object.keys(skills).reduce((sum,key)=>sum+parseFloat(skills[key]||0),0);&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; // Add&nbsp; &nbsp; indexOnTotal[total] = obj;}// Sortlet sorted = Object.keys(indexOnTotal).sort().reverse().map(key=> ({...indexOnTotal[key],key:key}) );// Logfor (var g in sorted) {&nbsp; &nbsp; // Original gladiator&nbsp; &nbsp; const [ name, skills, total ] = Object.values(sorted[g]);&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; &nbsp;// Name + Total&nbsp; &nbsp; &nbsp;console.log(`${name} (${total} skill)`);&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; // Skills&nbsp; &nbsp; for (const [name, value] of Object.entries(skills)) {&nbsp; &nbsp; &nbsp; &nbsp; console.log(`${name}: ${value}`);&nbsp; &nbsp; }}输出;Gladius (700 skill)Heal: 200Support: 250Shield: 250Pesho (400 skill)Duck: 400
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript