J'ai une configuration simple pour trouver les meilleurs scores. Le but est de classer qui a reçu les scores les plus élevés, puis de donner les 3 meilleurs points bonus.
Question: Dans la deuxième partie ci-dessous, je passe en revue les personnes et vérifie qui a obtenu le meilleur score. Le problème est que je dois le faire 3 fois pour chaque nom. La façon dont j'ai actuellement mis en place la boucle fonctionne mais semble très redondante. Est-ce la bonne façon de procéder?
for (i = 1; i < 5; i++) {
if (allGrades[0].name == 'andrew'){
andrewGradeBonus = 50;
if (allGrades[1].name == 'andrew'){
andrewGradeBonus = 25;
if (allGrades[2].name == 'andrew'){
andrewGradeBonus = 15;
if (allGrades[0].name == 'dave'){
daveGradeBonus = 50;
if (allGrades[1].name == 'dave'){
daveGradeBonus = 25;
if (allGrades[2].name == 'dave'){
daveGradeBonus = 15;
Deuxième partie. Donner aux 3 meilleurs scores un bonus de 50/25/15 en conséquence.
var allGrades = [
{name: 'andrew', score: 80},
{name: 'john', score: 90},
{name: 'sam', score: 31},
{name: 'frank', score: 50},
{name: 'dave', score: 95},
]
allGrades.sort(function(obj1, obj2) {
return obj2.score - obj1.score;
});
suite pour tous les noms ...
3 Réponses :
Vous pouvez simplement parcourir les notes et augmenter le score réel:
const bonusProp = `${grade.name.toLowerCase()}GradeBonus`
grade[bonusProp] = gradeBonuses[index];
Si vous vraiment voulez le bonus supplémentaire, changez simplement la note de . score + = gradeBonuses [index]; with
const gradeBonuses = [50, 25, 15];
allGrades.sort((a, b) => b.score - a.score).forEach((grade, index) => {
if (index < 3) {
grade.score += gradeBonuses[index];
}
});
Mais vu que l'objet a déjà le nom stocké dedans, pourquoi devez-vous ajouter le nom à le nom de votre propriété bonus?
Super utile - Merci!
Vous êtes sur la bonne voie, mais si vous triez déjà, il n'est pas nécessaire de recommencer. Vous connaissez déjà les trois personnes avec les scores les plus élevés qui sont aux index 0, 1 et 2. Je ferais simplement ce qui suit:
[{name:"dave",score:95,bonusPoints:50},
{name:"john",score:90,bonusPoints:25},
{name:"andrew",score:80,bonusPoints:15},
{name:"frank",score:50},
{name:"sam",score:31}]
Par conséquent, allGrades ressemblerait à ceci: p>
var allGrades = [
{name: 'andrew', score: 80},
{name: 'john', score: 90},
{name: 'sam', score: 31},
{name: 'frank', score: 50},
{name: 'dave', score: 95},
]
allGrades.sort(function(obj1, obj2) {
return obj2.score - obj1.score;
});
allGrades[0]["bonusPoints"] = 50;
allGrades[1]["bonusPoints"] = 25;
allGrades[2]["bonusPoints"] = 15;
Comme vous pouvez le voir, dans le résultat ci-dessus, vous savez que Dave a un score de 95 avec 50 points bonus. andrew 90 avec 25 points bonus et andrew 80 avec 15 points bonus. Les autres n'ont pas de points bunus.
Vous pouvez simplement trier et carte . Mon approche consiste à vérifier l'index dans le callback sort - puisque le tableau est déjà trié par ordre décroissant sur score , nous pouvons utiliser l'argument de rappel idx pour attribuez de manière appropriée les points bonus :
const allScores = [{
name: 'andrew',
score: 80
},
{
name: 'john',
score: 90
},
{
name: 'sam',
score: 31
},
{
name: 'frank',
score: 50
},
{
name: 'dave',
score: 95
}
];
const updateTopScores = allScores => {
return allScores.sort((a, b) => b.score - a.score).map((el, idx) => {
switch (idx) {
case 0:
el.bonus = 50
break;
case 1:
el.bonus = 25
break;
case 2:
el.bonus = 15
break;
default:
el.bonus = 0;
}
return el;
});
};
console.log(updateTopScores(allScores))
Super utile - Merci!
Np, content que ça aide!
Comment utilisez-vous le bonus plus tard? c'est-à-dire les variables comme
andrewGradeBonus. Parce qu'après la procédure de tri, vous saurez déjà quel bonus correspond à chacun.Hm. Mon problème est que je ne sais pas comment enregistrer ces données dans une nouvelle variable comme (andrewGradeBonus) sans passer par la deuxième étape.
Vous pouvez stocker le bonus à l'intérieur des objets, par exemple:
allGrades.sort (...). Map (({name, score}, idx) => ({name, score, bonus: getBonus (idx)} ))et oùgetBonus ()est une méthode qui renvoie le bonus correspondant pour chaque position.