2
votes

Comment trier les nombres pairs par ordre croissant et les nombres impairs par ordre décroissant dans un tableau?

Je ne sais pas comment trier les nombres impairs par ordre décroissant à droite des nombres pairs. Je suis un peu coincé ici, je sais qu'il me manque quelque chose.

Ma sortie est comme ceci: [2, 4, 6, 8, 10, 1, 3, 5, 7, 9]

Cela devrait être comme ceci: [2, 4, 6, 8, 10, 9, 7, 5, 3, 1]

var n = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
n.sort(function(a, b) {
  return a % 2 - b % 2 || b % 2 - a % 2;
});
console.log(n);


0 commentaires

5 Réponses :


0
votes

Avez-vous essayé de diviser le tableau en deux tableaux (un pour pair et un pour impair), puis trier chacun comme vous le souhaitez et les rejoindre à l'aide de l'opérateur de propagation [... pair, ... impair]

var n = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
var even = n.filter(a => a % 2 == 0).sort();
var odd = n.filter(a => a % 2 != 0).sort().reverse();
var numbers = [...even, ...odd];


0 commentaires

3
votes

Une solution simple et très coûteuse serait de construire deux tableaux, de les trier puis de les concaténer, mais vous pouvez combiner les deux tests et trier sur place comme ceci:

let arr = Array.from({length:10}, (_,i)=>i+1)
arr.sort((a,b)=> (a%2-b%2) || (a%2 ? b-a : a-b))
console.log(arr)

Comme vous pouvez le voir , le modèle de tri hiérarchique est simplement

arr.sort(compareA || compareB) 

que vous pouvez généraliser pour plus de conditions.

arr.sort((a,b)=> (a%2-b%2) || (a%2 ? b-a : a-b))


2 commentaires

Le code ne donne pas la sortie correcte. les nombres impairs doivent être dans l'ordre décroissant


Vous avez probablement mal compris. Voir les commentaires ce qu'OP a dit.



1
votes

Vous pouvez utiliser filter () pour obtenir différents tableaux de nombres pairs et impairs, puis les trier et les joindre en utilisant Spread Operator

var n = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
let odd = n.filter(x => x % 2).sort((a,b) => b-a);

let even = n.filter(x => !(x % 2) ).sort((a,b) => a-b);

let res = [...even,...odd]

console.log(res);


1 commentaires

C'est plus cher que nécessaire



1
votes

Vous pouvez filtrer les cotes et les égalités et, les trier et enfin concaténer les deux tableaux.

.as-console-wrapper { min-height: 100%; }
let n = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
let odds = n.filter((a) => a % 2 !== 0).sort((a, b) => b - a);
let even = n.filter((a) => a % 2 === 0).sort((a, b) => a - b);
let sorted = even.concat(odds);
console.log(sorted);


2 commentaires

OP: quelque chose comme ça [2, 4, 6, 8, 10, 9, 7, 5, 3, 1] - Les chances doivent également diminuer.


merci beaucoup, cela a fonctionné pour moi et j'ai compris où je me suis trompé



0
votes

Vous pouvez séparer deux tableaux et les fusionner par opérateur de répartition.

var n = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
odd  = n.filter (v => v % 2);
odd.sort((a,b) => b-a);
//console.log(odd)
even = n.filter (v => !(v % 2));
even.sort((a,b) => a-b);
//console.log(even);

console.log([...even,...odd]);

let n = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
let odd  = n.filter (v => v % 2);
odd.sort((a,b) => b-a);
//console.log(odd)
let even = n.filter (v => !(v % 2));
even.sort((a,b) => a-b);
//console.log(even);

console.log([...even,...odd]);


5 commentaires

Vous déclarez des variables globales implicites. Et il n'y a pas non plus de différence entre la mienne et votre réponse. Je pense que tu n'as pas vu le mien.


J'ai mis à jour la réponse, bien sûr, je ne connaissais pas votre réponse avant


J'ai supprimé le vote défavorable. Mais ce n'est pas agréable de dupliquer les réponses. Je ne dis pas que vous avez copié le mien. vous n'en avez pas besoin. Mais donner une réponse qui est exactement la même que les autres n'est pas si agréable. Utilisez let dans votre extrait


quand j'écris du code dans l'extrait, il est en plein écran, je ne vois pas ta réponse, tu ne devrais pas penser comme ça


Je ne comprends aucun problème.