0
votes

Renvoyer une nouvelle gamme de classements basés sur une matrice initiale

Je suis nouveau à JavaScript et j'essaie de créer une fonction qui accepte une matrice de toute longueur et crée un nouveau tableau avec le classement de ce tableau (c'est-à-dire [10, 5, 20] sortirait [2, 3 , 1]. C'est mon code jusqu'à présent (j'ai essayé à l'origine avec une plus grande série de boucles pour trouver le maximum à chaque fois, mais a couru dans des problèmes les obtenir pour répéter le même nombre de fois qu'il y a des chiffres dans la matrice, donc je suis restitué à une méthode de tri. Faites-moi savoir si quelqu'un peut aider à me diriger dans la bonne direction, merci !!

function rankings(array){
  let finalArray = [];
 for (i = 0; i < array.length; i++) {//set up final array
  finalArray[i] = array[i];
   }
  for(let list of array){
    array.sort((a,b)=>b-a)//array sorted in order
    }
    for (i = array.length-1; i>=0; i--){

    }
  return finalArray;
}


4 commentaires

Aiderait si vous avez expliqué pourquoi [10, 5, 20] devrait renvoyer [2, 3, 1] . La relation n'est pas claire et votre terme n'est pas votre terme "classement". Fournir également des données d'échantillon et des résultats attendus


La façon dont je comprends, 10, 5, 20 doit renvoyer 2, 1, 3 et non 2, 3, 1 . Sinon, je ne vois pas ce que vous entendez par «classement».


Qu'en est-il des mêmes valeurs? Ont-ils le même rang?


Salut - Désolé pour la confusion! Le nombre le plus élevé dans la matrice sera "1" et il comportera à partir de là (le 2e le plus élevé est deux, la plus faible est la longueur de la matrice). Voici quelques exemples de données et résultats attendus: classements ([6, 8, 1, 12, 4, 3, 9]); // [4, 3, 7, 1, 5, 6, 2] classement ([100]); // [1] Classements ([4, 2, 3, 1, 1]); // [1, 3, 2, 4]


3 Réponses :


0
votes

Trier un clone (via une propagation) de la matrice, selon votre logique de classement (décroissant dans ce cas). Utilisez array.map () Pour créer des tuples de [valeur, index + 1] et générer un Carte des tuples.

Utilisez array.map () code> sur le tableau d'origine et renvoyez les rangs respectifs de la carte:

p>

function rankings(array) {
  const ranks = new Map([...new Set(array)].sort((a, b) => b - a)
    .map((v, i) => [v, i + 1]))

  return array.map(v => ranks.get(v));
}

const result = rankings([10, 5, 20, 5]);

console.log(result);


0 commentaires

0
votes

Si vous aimez avoir les mêmes rangs, les mêmes valeurs, Cou pourrait prendre la valeur stockée pour la cartographie.

p>

const
    rankings = array => array.map(
        Map.prototype.get,
        [...array]
            .sort((a, b) => b - a)
            .reduce((i => (m, v) => m.set(v, m.get(v) || i++))(1), new Map)
    );

const result = rankings([10, 5, 20, 5]);

console.log(result);


0 commentaires

0
votes

Vous pouvez essayer:

p>

var data = [10, 5, 20, 5, 4, 25];
var sorted = [...new Set([...data].sort((a,b)=>b-a))] // sorting and filtering the data
var result = data.map(elem=> getIndex = sorted.findIndex(v=>v==elem)+1);
console.log(result);


0 commentaires