function rot13(str) {
let alphArr = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".split("");
let n = 13;
let arr = str.split("");
let len = alphArr.length;
for (let i of arr) {
if (alphArr.includes(i)) {
if (alphArr.indexOf(i) + n <= len - 1) {
i = (alphArr[alphArr.indexOf(i) + n])
console.log(i) // This is as expected
}
}
}
console.log(arr) // Array itself did not mutate and is showing the initial array.
return str;
}
rot13("SERR PBQR PNZC");
La valeur de i à l'intérieur de la deuxième instruction if est correcte comme on peut le voir dans l'instruction console.log mais le tableau en lui-même ne mute pas. Pourquoi était-ce?
P.S. Je l'ai résolu en utilisant la fonction map et cela fonctionne correctement car la fonction map ne modifie pas le tableau d'origine.
3 Réponses :
Vous ne pouvez pas définir directement la valeur sur l'élément dans la boucle for of, essayez ce qui suit ...
function rot13(str) {
let alphArr = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".split("");
let n = 13;
let arr = str.split("");
let len = alphArr.length;
let j=0
for (let i of arr) {
if (alphArr.includes(i)) {
if (alphArr.indexOf(i) + n <= len - 1) {
arr[j]= (alphArr[alphArr.indexOf(i) + n])
console.log(i) // This is as expected
}
}
j++
}
console.log(arr) // Array itself did not mutate and is showing the initial array.
return str;
}
rot13("SERR PBQR PNZC");
Si vous comptez utiliser un compteur de boucles, vous pouvez également utiliser une boucle régulière pour (let i = 0; i arr [i] < / code> à l'intérieur. Mélanger un for..of et des compteurs est tout simplement compliqué. Une meilleure solution serait de simplement parcourir les entrées du tableau, qui comprend l'index: for (let [index, element] de arr.entries ())
Oui, j'aurais fait cela pour mon code mais ici j'ai utilisé le code qui a été fourni par l'interrogateur.
Désolé pour la solution désordonnée
Je ne savais pas que vous ne pouviez pas faire et je n'ai trouvé aucune documentation indiquant que cela ne pouvait pas être fait. S'il vous plaît partager si vous avez si vous trouvez quelque chose.
L'élément dans la boucle for of contient uniquement la valeur d'une propriété particulière que vous pouvez voir sur les documents MDN.
J'ai la réponse. C'est à cause de la condition de passage par valeur.
Merci Parth. Vous êtes sur place! VLAZ l'a souligné ci-dessus et il a juste sonné une cloche.
Vous êtes les bienvenus
Au lieu d'utiliser une boucle for of , vous devez utiliser map pour créer un nouveau tableau et utiliser le tableau nouvellement mappé. Exemple de travail de foulage fixe:
function rot13(str) {
let alphArr = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".split("");
let n = 13;
let arr = str.split("");
let len = alphArr.length;
arr = arr.map((i) => {
if (alphArr.includes(i)) {
let index = (alphArr.indexOf(i) + n) % len;
return alphArr[index];
}
return i;
});
return arr.join("");
}
console.log(rot13("SERR PBQR PNZC")); // logs "FREE CODE CAMP"
Je l'ai résolu avec map car il ne modifie pas le tableau d'origine comme l'a souligné Matt, mais je ne sais pas pourquoi le tableau d'origine n'a pas été muté dans ce cas.
J'ai eu la réponse grâce à VLAZ. C'est à cause du passage par valeur et c'est pourquoi alphArr [alphArr.indexOf (i) + n] fonctionnerait.
Il convient de mentionner que votre code peut être simplifié:
<input type="text" placeholder="test here (use capital letters)"/> <p></p>
let rot = (str, n, asciiStart='A'.charCodeAt(0), asciiEnd='Z'.charCodeAt(0), asciiRange=asciiEnd-asciiStart+1) =>
str.split('')
.map(c => {
let code = c.charCodeAt(0) - asciiStart;
if (code >= 0 && code <= asciiRange) code = (code + n) % asciiRange;
return String.fromCharCode(asciiStart + code);
})
.join('');
let inp = document.getElementsByTagName('input')[0];
let p = document.getElementsByTagName('p')[0];
inp.addEventListener('input', () => p.innerHTML = rot(inp.value, 13));
Votre code ne fonctionnait pas car le remplacement de la valeur de i n'affecte pas l'index du tableau sur lequel i était initialement basé. Une fois que vous avez défini i , il ne se souvient plus de la manière dont il a été défini (par exemple, il ne pense pas en lui-même, "Je suis issu d'une valeur dans un tableau")
qu'essayez-vous de faire et quel est le résultat attendu?
Essayez console.log
alphArr [alphArr.indexOf (i) + n]l'affectation à
ine modifie pas le tableau. Vous réaffectez simplement une variable non liée dans ce cas.@VLAZ ohkay ... mais pourquoi est-ce une variable sans rapport. Je suppose que c'était l'élément actuel du tableau. Veuillez élaborer un peu plus et partager toute documentation si disponible. J'aimerais vraiment aller au fond des choses et je vous en serais très reconnaissant.
C'est la valeur de l'élément de tableau actuel. Cependant, sa modification ne changera pas le tableau, car JavaScript n'est pas une référence au passage
@VLAZ Maintenant, je comprends. C'est dû au passage par valeur car il représente simplement la valeur de l'élément. Merci beaucoup pour la clarification!
@HWSiew En fait, c'est juste une partie de tout le problème que j'avais besoin de résoudre. Ma faute. J'aurais dû fournir tout le contexte, mais c'était suffisant pour la requête spécifique que j'avais.
@luekbaja Cela fonctionne. Je comprends maintenant pourquoi cela ne fonctionnait pas.