TLDR: ¿Existe alguna alternativa del método Array.index()
de Python en JavaScript que trate los índices negativos de la misma manera que Array.index()
de Python?
Para el fondo, estoy escribiendo un código para el cifrado César (enlace de Wikipedia).
He escrito el siguiente código en Python:
alphabet = list('abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz') # list('abc') == ['a', 'b', 'c'] def caesar(text, shift, direction): endText = '' if direction == 'encode': shift = shift else: shift *= -1 for i in text: oldIndex = alphabet.index(i) newIndex = oldIndex + shift newLetter = alphabet[newIndex] endText += newLetter print(endText) caesar('zeus', 5, 'encode') # 'ejzx' caesar('ejzx', 5, 'decode') # 'zeus'
Cuando ingreso una palabra que tiene letras que están hacia el final del alfabeto inglés (es decir, que contiene letras como v, w, x, y, z, etc.), codifica la palabra y cuando decodifico el resultado, da la palabra Codifiqué previamente sin ningún error.
Cuando escribo exactamente el mismo código en JavaScript, y cuando codifico el mismo mensaje que usé en el código de Python ('zeus'), me da ejzx
; sin embargo, cuando decodifico ejzx
, me da undefinedeus
en lugar de zeus
, es decir, decodifica eus
, pero no la z
inicial.
let alphabet = 'abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz'.split(''); function caesar(text, shift, direction) { let endText = ''; if (direction == 'encode') { shift = shift; } else if (direction == 'decode') { shift *= -1; } for (let i of text) { let oldIndex = alphabet.indexOf(i); let newIndex = oldIndex + shift; let newLetter = alphabet[newIndex]; endText += newLetter; } console.log(endText) } caesar('zeus', 5, 'encode') // 'ejzx' caesar('ejzx', 5, 'decode') // 'undefinedeus'
Intenté reemplazar indexOf()
con Array.at()
(enlace MDN), pero devuelve undefinedundefinedundefinedundefined
tanto en la codificación como en la decodificación.
¿Cómo podría arreglar el código para que funcione igual que Python?
No tiene que reemplazar indexOf() con Array.prototype.at(), en lugar de eso, debe reemplazar alphabet[newIndex] por alphabet.at(newIndex);
let alphabet = 'abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz'.split(''); function caesar(text, shift, direction) { let endText = ''; if (direction == 'encode') { shift = shift; } else if (direction == 'decode') { shift *= -1; } for (let i of text) { let oldIndex = alphabet.indexOf(i); let newIndex = oldIndex + shift; let newLetter = alphabet.at(newIndex); endText += newLetter; } console.log(endText) }
Espero que esto ayude.
No sé pyton, pero en javascript el índice siempre comienza desde 0.
De esta manera, en su ejemplo, para codificar la letra "z" (índice: 25, posición: 26), agrega 5 al índice y devuelve la letra "e" (índice: 30, posición: 31), entonces hasta ahora todo bien. Para decodificar la letra "e", javascript la encuentra en el índice 4 (posición 5) y al restarle 5 resulta que el índice que busca para la nueva letra es -1 y como ese índice no existe, devuelve indefinido . Para evitar esto, cuando decodifique, agregue 26 al "cambio" (un alfabeto) para que use el segundo conjunto de caracteres de la variable del alfabeto, y como siempre irá hacia atrás (restar), siempre encontrará el correspondiente personaje.
let alphabet = 'abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz'.split(''); function caesar(text, shift, direction) { let endText = ''; if (direction == 'encode') { shift = shift; } else if (direction == 'decode') { shift = (shift * -1) + 26; } for (let i of text) { let oldIndex = alphabet.indexOf(i); let newIndex = oldIndex + shift; let newLetter = alphabet[newIndex]; endText += newLetter; } console.log(endText) } caesar('zeus', 5, 'encode') // 'ejzx' caesar('ejzx', 5, 'decode') // 'zeus'