¿Cómo puedo enmascarar todos los dígitos que el usuario ingresa dinámicamente?
Escenario 1: Entrada de usuario: 1234 5678 9123 4414 Salida: xxxx xxxx xxxx 4414
Escenario 2: Entrada de usuario: 12345678 8234245 Salida: xxxxxxxx xxx4245
Escenario 3: Entrada del usuario: 12 345678911 Salida: xx xxxxx8911
Lo que tengo es solo una solución y es estático. ¿Cómo puedo hacer que mi código sea dinámico? para que pueda disminuir mi declaración if else?
function hideMask(num) { var regExp = /[a-zA-Z]/g; if(regExp.test(num)){ return null; } else { if(num.replace(/\s/g, '').length == 16){ // 16 digit mask = num.substring(num.length - 14).replace(/\d/g,"x"); unmaskCardNumber = num.substring(14, 19); return(mask + unmaskCardNumber); }else if(num.replace(/\s/g, '').length == 18){ //18 digit mask = num.substring(0,15).replace(/\d/g,"x"); unmaskCardNumber = num.substring(15, 19); return(mask + unmaskCardNumber); }else{ return null; } } }Puede lograr fácilmente el resultado usando split , reverse y map
function mask(s) { let count = 0; return s .split("") .reverse() .map((n, i) => (!n.match(/\d/) ? n : count < 4 ? (count++, n) : "x")) .reverse() .join(""); } function mask(s) { let count = 0; return s .split("") .reverse() .map((n, i) => { if (!n.match(/\d/)) return n; else { return count < 4 ? (count++, n) : "x"; } }) .reverse() .join(""); } console.log(mask("1234 5678 9123 4414")); console.log(mask("12345678 8234245")); console.log(mask("12 345678911")); console.log(mask("12 345678 9 1 1")); // CORNER CASE Incluso puede omitir el paso reverse si usa reduceRight como:
function mask(s) { let count = 0; return s .split("") .reduceRight((acc, n, i) => { acc.push(!n.match(/\d/) ? n : count < 4 ? (count++, n) : "x"); return acc; }, []) .reverse() .join(""); } function mask(s) { let count = 0; return s .split("") .reduceRight((acc, n, i) => { acc.push(!n.match(/\d/) ? n : count < 4 ? (count++, n) : "x"); return acc; }, []) .reverse() .join(""); } console.log(mask("1234 5678 9123 4414")); console.log(mask("12345678 8234245")); console.log(mask("12 345678 9 1 1"));Lo haría, usando slice y replace : primero reemplace todos los caracteres alfanuméricos en la cadena, barra los últimos cuatro con 'x' y agregue los últimos cuatro de antes:
function mask(input) { return input .slice(0, input.length - 4) .replace(/([a-zA-Z0-9])/g, 'x') + input.slice(-4) } console.log(mask('abcd efgh 1234 5678'))