3
votes

écrire une fonction qui accepte une chaîne et renvoie une nouvelle chaîne avec uniquement les lettres majuscules passées à la chaîne

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!


4 commentaires

doit être if (string [i] === string [i] .toUpperCase ()) - le () est important


aussi 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?


6 Réponses :


2
votes

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');


0 commentaires

4
votes

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
  • supprimer le bloc {} 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:

  • A vaut 65
  • Z est 90
  • a vaut 97
  • z vaut 122

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"));


4 commentaires

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.



1
votes

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"


1 commentaires

je suggère de l'ajouter dans l'extrait de code. qui rend la réponse plus interactive



1
votes

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];
}


3 commentaires

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é



1
votes

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 :)


2 commentaires

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, '')



1
votes

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"));


0 commentaires