4 回答

TA貢獻1776條經驗 獲得超12個贊
我們應該能夠使用 Object.entries 和 Array.sort 按照我們的意愿排列對象,然后打印出結果:
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));
})

TA貢獻1788條經驗 獲得超4個贊
我會把你的計算分成一個單獨的數組,并在你輸出之前對這個新數組進行排序。例如:
const gladiators = {
Pesho: { Duck: '400' },
Gladius: { Heal: '200', Support: '250', Shield: '250' }
}
const valueDescNameAsc = (a, b) => {
if (a.value === b.value) return a.name.localeCompare(b.name)
return a.value > b.value ? -1 : 1
}
// Transform data into arrays of objects (and calculate top-level value)
const gladiatorSkills = Object.entries(gladiators)
.map(([name, skills]) => ({
name,
value: Object.values(skills).map(Number).reduce((a, b) => a + b, 0),
skills: Object.entries(skills).map(([name, value]) => ({ name, value })).sort(valueDescNameAsc)
}))
.sort(valueDescNameAsc)
// Output the transformed gladiatorSkills data
for (let { name, value, skills } of gladiatorSkills) {
console.log(`${name}: ${value} skill`)
for (let { name, value } of skills) {
console.log(`- ${name} <!> ${value}`)
}
}

TA貢獻1779條經驗 獲得超6個贊
對象不是按照順序構建的。這是數組的工作。查看您的數據,擁有一個可以使用數組方法(例如排序)進行操作的角斗士列表會更合適。
因此,在下面的示例中,我將您的數據重寫為一個對象數組,其中包含嵌套數組。這將保證訂單將得到兌現。
它還將使代碼的操作不那么復雜,因為您只是在處理數組,不需要轉換。map,reduce和的組合 sort將帶您到達您需要去的地方。
const gladiators = [
{
name: 'Pesho',
stats: [
{
name: 'Duck',
value: 400
}
],
},
{
name: 'Gladius',
stats: [
{
name: 'Heal',
value: 200
},
{
name: 'Support',
value: 300
},
{
name: 'Shield',
value: 250
}
],
},
];
gladiators
/**
* Calculate the total skill and
* sort the skills based on their value.
*/
.map(({ name, stats }) => {
const skill = stats.reduce((acc, { value }) => acc + value, 0);
const sortedStats = stats.sort((a, b) => b.value - a.value);
return { name, skill, stats: sortedStats };
})
/**
* Sort the gladiators by skill (desc)
*/
.sort((a, b) => b.skill - a.skill)
/**
* Print the data
*/
.forEach((gladiator) => {
console.log(`${gladiator.name}: ${gladiator.skill}`)
gladiator.stats.forEach(({ name, value }) => {
console.log(`- ${name} <!> ${value}`);
});
});

TA貢獻2012條經驗 獲得超12個贊
我會通過創建一個新列表來簡化這個問題,以總技能水平為索引,然后對該列表進行排序,并記錄每個條目;
注意:這段代碼可以進一步簡化,但我已經這樣發布了,所以步驟對 OP 來說很清楚;
// Original data
const data = { Pesho: { Duck: '400' }, Gladius: { Heal: '200', Support: '250', Shield: '250' } };
// Index each gladiator on total skill
let indexOnTotal = {};
for (let obj of Object.entries(data)) {
// Get obj value's
const [name, skills] = obj;
// Total Skill count
const total = Object.keys(skills).reduce((sum,key)=>sum+parseFloat(skills[key]||0),0);
// Add
indexOnTotal[total] = obj;
}
// Sort
let sorted = Object.keys(indexOnTotal).sort().reverse().map(key=> ({...indexOnTotal[key],key:key}) );
// Log
for (var g in sorted) {
// Original gladiator
const [ name, skills, total ] = Object.values(sorted[g]);
// Name + Total
console.log(`${name} (${total} skill)`);
// Skills
for (const [name, value] of Object.entries(skills)) {
console.log(`${name}: ${value}`);
}
}
輸出;
Gladius (700 skill)
Heal: 200
Support: 250
Shield: 250
Pesho (400 skill)
Duck: 400
添加回答
舉報