J'ai un tableau comme ceci:
people = [
{id:1,name:'abc',age:18},
{id:3,name:'abce',age:18},
{id:4,name:'abcf',age:18},
{id:2,name:'abcd',age:20},
{id:5,name:'abcg',age:21},
{id:6,name:'abch',age:20},
{id:5,name:'abcg',age:21},
{id:7,name:'abci',age:17},
]
4 Réponses :
compter juste des âges et trier descendant par le comte.
p>
.as-console-wrapper { max-height: 100% !important; top: 0; }
Cela ne doit-il pas exécuter réduire code> deux fois pour chaque élément de la matrice?
La réduction des visites de chaque élément de la matrice qu'une seule fois.
@paul comptage code> est le résultat après Réduire code> exécute.
La référence de tri le résultat du réduit, il ne l'appelle pas
Merci pour votre commentaire
@Zemzem, s'il vous plaît jeter un oeil à la modification, qui couvre maintenant l'ordre du même compte.
@Ninascholz oh wow c'est très propre. Cela signifie beaucoup pour moi bro !! . Mais je me demande si l'âge est une chaîne, comment faire de la sorte?
@Zemzem, tant que la valeur convertit sur un numéro, il n'y a pas de problème, car - code> convertit les deux opérandes en chiffres.
Si quelqu'un a un problème de tri ne fonctionne pas, il suffit d'ajouter de retour à la valeur de la fonction de tri
Essayez ceci:
p>
let people = [{ id: 1, name: 'abc', age: 18 }, { id: 2, name: 'abcd', age: 20 }, { id: 3, name: 'abce', age: 18 }, { id: 4, name: 'abcf', age: 18 }, { id: 5, name: 'abcg', age: 21 }, { id: 6, name: 'abch', age: 20 }, { id: 7, name: 'abci', age: 17 }];
let tmpAge = {};
for (let i = 0; i < people.length; i++) {
if (!tmpAge[people[i].age]) {
tmpAge[people[i].age] = 1;
} else {
tmpAge[people[i].age]++;
}
}
people.sort((a, b) => tmpAge[b.age] - tmpAge[a.age]);
console.log(people);Oui bien sûr !! Je vous remercie !!
const people = [
{ id: 1, name: 'abc', age: 18 },
{ id: 2, name: 'abcd', age: 20 },
{ id: 3, name: 'abce', age: 18 },
{ id: 4, name: 'abcf', age: 18 },
{ id: 5, name: 'abcg', age: 21 },
{ id: 6, name: 'abch', age: 20 },
{ id: 7, name: 'abci', age: 17 },
];
const agesFrequency = people.reduce((previousValue, currentValue) => {
const { age } = currentValue;
return {
...previousValue,
[age]: (
previousValue[age] || 0
) + 1,
};
}, {});
people.sort((
(a, b) =>
agesFrequency[b.age] - agesFrequency[a.age]
));
console.log(people);
Je l'ai résolu. Modifier la fonction Trier sur
people.sort((a, b) => {
if (count[b.age] === count[a.age]) {
if (b.age < a.age) {
return -1;
}
if (b.age > a.age) {
return 1;
}
return 0;
} else if (count[b.age] < count[a.age]) {
return -1;
}
});
Comptez la fréquence pour chaque âge, puis trier par elle.