1
votes

Vérification de la boucle de correspondance la plus efficace

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 commentaires

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.


3 Réponses :


3
votes

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?


1 commentaires

Super utile - Merci!



2
votes

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.


0 commentaires

1
votes

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))


2 commentaires

Super utile - Merci!


Np, content que ça aide!