A partir de mi pregunta anterior , descubrí cómo puedo reemplazar varios textos en una matriz sin llamar a la función .replace muchas veces
const iconMap = { "ico.Win10": '<i class="fab fa-windows"></i>', "ico.Ubuntu": '<i class="fab fa-ubuntu"></i>', "ico.Whatsapp": '<i class="fab fa-whatsapp"></i>', "ico.Instagram": '<i class="fab fa-instagram"></i>', "ico.Google": '<i class="fab fa-google"></i>', "ico.Microsoft": '<i class="fab fa-microsoft"></i>', "ico.Twitter": '<i class="fab fa-twitter"></i>', "ico.Facebook": '<i class="fab fa-facebook"></i>', } var userText = "ico.Win10 + S"; var keysArray = userText.split("+").filter(e => String(e)); keysArray = $.map(keysArray, $.trim); for (let i = 0; i < keysArray.length; i++) { if (iconMap[keysArray[i]] != undefined) { keysArray[i] = keysArray[i].replace(keysArray[i], iconMap[keysArray[i]]) } } console.log(keysArray) <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> Pero si mi variable de texto de userText cambia a algo como "ico.Win10 Windows + S";
Obtengo la salida ["ico.Win10 Windows", "S"] en lugar de ["<i class="fab fa-windows"></i> Windows", "S"]
El duplicado que se marcó para su publicación anterior indicaba el uso de expresiones regulares para el reemplazo, lo que permite apuntar a patrones específicos dentro de una cadena.
Puede aplicar esto a su caso de uso, buscando subcadenas que comiencen con ico. . Para permitir la posibilidad de que pueda haber más de una subcadena de este tipo, el fragmento a continuación usa matchAll() para iterar sobre todas las coincidencias y reemplazar si hay una propiedad correspondiente en la búsqueda de iconMap .
const iconMap = { 'ico.Win10': '<i class="fab fa-windows"></i>', 'ico.Ubuntu': '<i class="fab fa-ubuntu"></i>', 'ico.Whatsapp': '<i class="fab fa-whatsapp"></i>', 'ico.Instagram': '<i class="fab fa-instagram"></i>', 'ico.Google': '<i class="fab fa-google"></i>', 'ico.Microsoft': '<i class="fab fa-microsoft"></i>', 'ico.Twitter': '<i class="fab fa-twitter"></i>', 'ico.Facebook': '<i class="fab fa-facebook"></i>', }; const replaceIco = (str) => { for (const [, ico] of str.matchAll(/(ico\..*?)\s/g)) { str = str.replace(ico, iconMap[ico] ?? ico); } return str; }; const userText = 'ico.Whatsapp WhatsApp ico.Win10 Windows + S'; const keysArray = userText.split('+').map(replaceIco); console.log(keysArray); Si prefiere no usar/aprender RegExp, puede lograr lo mismo usando métodos de matriz dividiendo la cadena pasada en cada ' ' y mapeando sobre cada palabra que devuelve los valores de la tabla de búsqueda si existen.
const iconMap = { 'ico.Win10': '<i class="fab fa-windows"></i>', 'ico.Ubuntu': '<i class="fab fa-ubuntu"></i>', 'ico.Whatsapp': '<i class="fab fa-whatsapp"></i>', 'ico.Instagram': '<i class="fab fa-instagram"></i>', 'ico.Google': '<i class="fab fa-google"></i>', 'ico.Microsoft': '<i class="fab fa-microsoft"></i>', 'ico.Twitter': '<i class="fab fa-twitter"></i>', 'ico.Facebook': '<i class="fab fa-facebook"></i>', }; const replaceIco = (str) => { return str .split(' ') .map((s) => iconMap[s] ?? s) .join(' '); }; const userText = 'ico.Whatsapp WhatsApp ico.Win10 Windows + S'; const keysArray = userText.split('+').map(replaceIco); console.log(keysArray);