donc je suis entré dans cette question dans un tutoriel javascript de rithm school (ce qui est de loin très sympa): écrivez une fonction appelée onlyCapitalLetters qui accepte une chaîne et retourne une nouvelle chaîne avec seulement les lettres majuscules passées au chaîne. voici la sortie demandée:
onlyCapitalLetters('TbRnY OnUmT');
ils ont cette solution, mais ils utilisent cette méthode .charCodeAt () dont ils n'ont pas encore parlé, et qui semble également assez sophistiquée. en ce moment, je lis beaucoup de documentation à ce sujet mais je n'arrive toujours pas à la creuser.
avant de me lancer dans leur solution, Iv'e a essayé quelque chose d'autre par moi-même, basé sur le choses qui ont déjà été présentées dans ce didacticiel.
Solution de rithm school:
function onlyCapitalLetters(string) { var newString = ''; for(i=0;i<string.length;i++) { if(string[i] === string[i].toUpperCase) { } newString += string[i]; } return newString; }
ma tentative:
function onlyCapitalLetters(str){ var newStr = ''; for(var i = 0; i < str.length; i++){ if(str[i].charCodeAt(0) < 91 && str[i].charCodeAt(0) > 64 ){ newStr += str[i]; } } return newStr; }
cependant, quand j'ai jeté une chaîne comme argument, comme
onlyCapitalLetters("Amazing") // "A" onlyCapitalLetters("nothing") // "" onlyCapitalLetters("EVERYTHING") // "EVERYTHING"
cela m'a renvoyé la chaîne telle quelle, à l'instar d'une nouvelle chaîne en majuscules .
"TbRnY OnUmT"
y a-t-il un moyen, plus dans cette direction simplifiée que j'ai essayé, de faire en sorte que cette fonction se produise? en outre, est-ce que quelqu'un a des idées sur ce charCodeAt et toute sa solution en général? Ceci est mon premier message, alors merci pour votre aide quand même!
6 Réponses :
Je vais le faire en utilisant regex
.
/ [AZ] / g
correspond à toutes les lettres majuscules.
join ('')
convertit le tableau des caractères correspondants en chaîne.
function onlyCapitalLetters(input){ let op = input.match(/[A-Z]/g) || '' if(op) op = op.join('') console.log(op) } onlyCapitalLetters("Amazing") // "A" onlyCapitalLetters("nothing") // "" onlyCapitalLetters("EVERYTHING") onlyCapitalLetters('TbRnY OnUmT');
Concernant votre tentative, vous y étiez presque! Vos erreurs étaient:
toUpperCase
doit être toUpperCase ()
, car c'est une méthode qui doit être appliquée {}
vide; cela empêchera l'instruction suivante d'être exécutée uniquement lorsque l'instruction if
est vraie; vous pouvez également déplacer la concaténation dans le bloc {}
La version modifiée est ci-dessous:
function isUppercaseLetter(c) { return (c.charCodeAt(0) >= 65 && c.charCodeAt(0) <= 90); } function onlyCapitalWithFilter(s) { return s.split('').filter(c => isUppercaseLetter(c)).join(''); } function onlyCapitalWithReduce(s) { return s.split('').reduce((a, c) => isUppercaseLetter(c) ? a + c : a, ''); } console.log(onlyCapitalWithFilter("nothing")); console.log(onlyCapitalWithFilter("TesT")); console.log(onlyCapitalWithFilter("TbRnY OnUmT")); console.log(onlyCapitalWithFilter("S@P#E!C#I?A;L")); console.log(onlyCapitalWithReduce("nothing")); console.log(onlyCapitalWithReduce("TesT")); console.log(onlyCapitalWithReduce("TbRnY OnUmT")); console.log(onlyCapitalWithReduce("S@P#E!C#I?A;L"));
Cependant, cela ne fonctionnera pas pour une chaîne comme "abc # @", car appliquer toUpperCase ()
à un caractère spécial, renverra le même caractère, et si sera vrai, ce qui entraînera une concaténation. C'est pourquoi ils ont utilisé charCodeAt (0)
. Cette fonction en javascript renvoie un entier entre 0 et 65535 représentant l'unité de code UTF-16 à l'index donné. Pour les caractères ASCII, cela signifie qu'il renverra un nombre entre 0 et 127. Que pouvons-nous faire avec ce nombre? Nous pouvons le comparer avec d'autres nombres (jetez un œil à la table ASCII ici ) et testez s'il s'agit d'un lettre valide ou non. En regardant dans ce tableau, nous pouvons voir que:
Avec les informations ci-dessus, nous pouvons créer une autre fonction nommée isLetter
qui testera si un caractère donné est une lettre valide ou non. Comment? Teste si le code de notre personnage est entre A et Z ou a et z. Mais comme nous n'avons de toute façon pas besoin des plus petites lettres, nous pouvons simplement tester [A, Z]. En combinant cela avec le code ci-dessus, nous aurons ceci:
function isUppercaseLetter(c) { return (c.charCodeAt(0) >= 65 && c.charCodeAt(0) <= 90) } function onlyCapital(string) { var newString = ''; for (i = 0; i < string.length; i++) { if (isUppercaseLetter(string[i])) { newString += string[i]; } } return newString; } console.log(onlyCapital("nothing")); console.log(onlyCapital("EVERYTHING")); console.log(onlyCapital("TbRnY OnUmT")); console.log(onlyCapital("S@P#E!C#I?A;L"));
Je vais le faire en utilisant la fonction lambda filter
Tout d'abord, nous convertissons la chaîne en un tableau de caractères, puis ne conservons que les caractères majuscules. Vous pouvez en savoir plus sur le fonctionnement de la réduction ici . Une autre méthode utilisant des fonctionnels serait avec réduire
. Vous pouvez voir comment la réduction fonctionne ici . En gros, j'utilise split
pour transformer la chaîne en un tableau de caractères, puis pour chaque caractère, je l'ajoute au résultat partiel ou je garde simplement le résultat partiel. Au final, je devrais avoir ma chaîne.
function onlyCapital(string) { var newString = ''; for (i = 0; i < string.length; i++) { if (string[i] === string[i].toUpperCase()) newString += string[i]; } return newString; } console.log(onlyCapital("nothing")); console.log(onlyCapital("TesT")); console.log(onlyCapital("TbRnY OnUmT"));
Votre code échoue. essayez ceci rien @ #
et voyez la sortie
@CodeManiac J'ai mis à jour ma réponse en conséquence :) Merci!
Merci beaucoup! bien que drôle de reconnaître que c'était une erreur de syntaxe, j'ai vraiment beaucoup appris de votre réponse
Plus précisément, charCodeAt
renvoie les valeurs d'unité de code qui proviennent du codage de caractères UTF-16 appliqué aux points de code de Jeu de caractères Unicode . Toute similitude avec l'ASCII n'est pas pertinente.
function onlyCapitalLetters(string) { // prime the function response. let response = ""; // match all groups of uppercase letters. let result = string.match(/([A-Z]+)/g); // check for matches. if( result != null && result.length ) { // remove first element of match result (which returns the original string. result.unshift(); // join the array into a string with an empty "separator". response = result.join(''); } console.log(response); return response; } onlyCapitalLetters("Amazing") // "A" onlyCapitalLetters("nothing") // "" onlyCapitalLetters("EVERYTHING") // "EVERYTHING" onlyCapitalLetters('TbRnY OnUmT'); // "TRYOUT"
je suggère de l'ajouter dans l'extrait de code. qui rend la réponse plus interactive
Pour corriger votre code, utilisez toUpperCase () en incluant les parenthèses et concaténez la chaîne à l'intérieur de l'instruction if:
function onlyCapitalLetters(string) { return string.replace(/[^A-Z\s]+/g, ''); } console.log(onlyCapitalLetters('TbRnY OnUmT'));
Notez que comme @ CodeManiac souligne que cette fonction ne supprimera pas les caractères spéciaux de la chaîne. Utiliser rien @ #
renverra des données @#
Par exemple
function onlyCapitalLetters(string) { var newString = ''; for (let i = 0; i < string.length; i++) { if (string[i] === string[i].toUpperCase()) { newString += string[i]; } } return newString; } console.log(onlyCapitalLetters('TbRnY OnUmT')); console.log(onlyCapitalLetters('nothing@#'));
Une autre option pourrait être de ne pas remplacer un caractère majuscule ou un espace blanc par une chaîne vide:
if (string[i] === string[i].toUpperCase()) { newString += string[i]; }
Votre deuxième sortie diffère de la première. espace
est manquant dans le second. Je suppose que [^ A-Z] +
est ce que vous vouliez dire
@CodeManiac Je vois, net. Je l'ai mis à jour avec \ s
à la place. Je vous remercie!
toujours le premier extrait n'est pas ce que la question pose. rien @ #
ne produira cinq @ #
ce qui n'est pas souhaité
Voici une solution compacte
string.replace(/[^a-z]/gi, '') (string.split('').filter((item)=>{return item == item.toUpperCase()})).join("")
Tout d'abord, remplacez tous les caractères autres que les alphabets
var string = "ABCefgGHaI";
Vous pouvez le faire en divisant le mot et en filtrant uniquement ceux qui sont en majuscules et en les rejoignant :)
chool! mais regardez ce que @CodeManiac a indiqué. essayez de changer la valeur de la chaîne en rien @ # et voyez ce qui se passe
Merci d'avoir fait remarquer cela. Mise à jour de la réponse d'abord Supprimez tous ces caractères par cette regex input.replace (/ [^ a-z] / gi, '')
Une autre option utilise la déstructuration des tableaux
comme paramètre de fonction.
const onlyCapitalLetters = ([...myarr] = e) => myarr.filter(el => el === el.toUpperCase()).join(''); console.log(onlyCapitalLetters("Amazing")); console.log(onlyCapitalLetters("nothing")); console.log(onlyCapitalLetters("EVERYTHING"));
doit être
if (string [i] === string [i] .toUpperCase ())
- le()
est importantaussi je pense que votre solution est meilleure :)
L'emplacement de vos crochets fermants
}
est également incorrect.Doit-il également fonctionner pour des chaînes comme "abc @ #" (avec des caractères spéciaux) ou ce n'est pas le cas?