Tengo la función de traducir caracteres cirrílicos al latín, y también algunos caracteres. Además, necesito traducir '.' a '-', pero si agrego '.':'-' al objeto ru, los números se traducen como undefined . Escapar de un punto \. no ayudes Puedo agregar en ru-object cada número para corregir, pero quiero entender por qué sucede esto.
let ru = { 'а': 'a', 'б': 'b', 'в': 'v', 'г': 'g', 'д': 'd', 'е': 'e', 'ё': 'e', 'ж': 'j', 'з': 'z', 'и': 'i', 'й': 'j', 'к': 'k', 'л': 'l', 'м': 'm', 'н': 'n', 'о': 'o', 'п': 'p', 'р': 'r', 'с': 's', 'т': 't', 'у': 'u', 'ф': 'f', 'х': 'h', 'ц': 'c', 'ч': 'ch', 'ш': 'sh', 'щ': 'shch', 'ъ': '', 'ы': 'y', 'ь': '', 'э': 'e', 'ю': 'u', 'я': 'ya', ' ': '-', '/': '-', '«':'', '»':'', '.':'-' }; function trans(str){ str1 = str.toLowerCase(); let result = str1.replace( new RegExp(Object.keys(ru).join('|'), 'g'), function(match) { return ru[match]; } ); return result; } alert( trans('150собственников.ру')); //undefinedundefinedundefinedsobstvennikov-ruDebe mantener la matriz ru como está, pero al crear la expresión regular a partir de claves, escape el punto.
Puedes usar
let ru = { 'а': 'a', 'б': 'b', 'в': 'v', 'г': 'g', 'д': 'd', 'е': 'e', 'ё': 'e', 'ж': 'j', 'з': 'z', 'и': 'i', 'й': 'j', 'к': 'k', 'л': 'l', 'м': 'm', 'н': 'n', 'о': 'o', 'п': 'p', 'р': 'r', 'с': 's', 'т': 't', 'у': 'u', 'ф': 'f', 'х': 'h', 'ц': 'c', 'ч': 'ch', 'ш': 'sh', 'щ': 'shch', 'ъ': '', 'ы': 'y', 'ь': '', 'э': 'e', 'ю': 'u', 'я': 'ya', ' ': '-', '/': '-', '«': '', '»': '', '.': '-' }; function trans(str) { const regex = new RegExp(Object.keys(ru).map(x => x.replace('.', '\\.')).join('|'), 'g'); let result = str.toLowerCase().replace(regex, function(match) { return ru[match[0]]; }); return result; } console.log(trans('150собственников.ру')); Si desea usar algún carácter, asegúrese de simplemente usar la función de escape correcta, consulte ¿Existe una función RegExp.escape en JavaScript? . Luego, solo tendrá que reemplazar .map(x=>x.replace('.','\\.')) con .map(x=>x.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&')) .