Disons que j'ai un tableau comme celui-ci:
["z", "bb", "a", 1, 2, 3, 4]
et je veux que le tableau de résultat soit le suivant:
export const someBrokenSort = (option1, option2) => {
const numberOption1 = Number(stripCommas(option1));
const numberOption2 = Number(stripCommas(option2));
if (numberOption1 < numberOption2 || isNaN(numberOption1)) return -1;
if (numberOption1 > numberOption2 || isNaN(numberOption2)) return 1;
return 0;
};
Comment puis-je écrire cela? J'ai ceci comme prédicat:
["a", "bb", "z", 1, 2, 3, 4]
Mais cela résulte de ceci:
["a", "bb", 1, 2, "z", 4, 3]
3 Réponses :
En variante:
const arr = ["a", "bb", 1, 2, "z", 4, 3]; const sorted = [ ...arr.filter(el => typeof el === 'string'), ...arr.filter(el => typeof el === 'number').sort(), ]; console.log(sorted);
Bon, note latérale, si nous avons besoin de trier la chaîne, nous devons juste ajouter un tri à la fin. var sorted1 = [... arr1.filter (el => typeof el === 'string'). sort (), ... arr1.filter (el => typeof el === 'nombre'). sort ( ),];
Mais cette façon a une surcharge de deux tableaux alloués supplémentaires et il ne trie pas le tableau en place)
Vous pouvez vérifier le type et déplacer les chaînes vers le haut.
var array = ["a", "bb", 1, 2, "z", 4, 3];
array.sort((a, b) =>
(typeof a === 'number') - (typeof b === 'number') ||
a - b
);
console.log(array);
ce (typeof a === 'number') - (typeof b === 'number') ne serait-il pas évalué à boolean - boolean ?
@Scrimothy false est forcé à 0 avec un opérateur numérique.
hmm, ouais c'est intéressant. Intelligent
Quand la condition or est-elle atteinte?
Ohhhh vrai - vrai == 0 qui est faux nvm.
@NinaScholz avez-vous essayé avec ["a", "zbb", 1, 0, 2, "z", 4, 3];
@gaetanoM, je l'ai fait. que doit-il se passer?
@NinaScholz Je suppose que vous ne triez pas les chaînes. Peux-tu vérifier?
@gaetanoM, c'est vrai, op veut garder l'ordre des chaînes.
Merci beaucoup. Je suis devenu fou pour obtenir le contraire.
Mais quand il y a 2 chaînes comparées, nous faisons toujours a - b, non? Nous obtenons faux - faux qui évalue à 0 ce qui est faux et donc le côté droit évalue quand a et b sont des chaînes, non? N'est-ce pas ce que nous voulons?
@ Jwan622, il ne mttter, car les chaînes sont converties en nombre, cela donne NaN et la différence est toujours NaN qui est interprétée comme zéro ce qui signifie que les deux éléments sont dans le bon ordre.
Oh donc 0 est la même chose que NaN ?
NON! Pas un nombre n'est pas zéro. Mais pour Array # sort code> , chaque valeur falsy est interprétée comme zéro .
aimez-vous aussi trier la chaîne?
Non, je n'ai pas besoin de trier la chaîne réelle. "a" doit juste être devant