乐趣区

关于前端:js字符串脱敏名字手机号银行卡号身份证号

/*
* description 字符串脱敏解决 substr repeat Math.min(max, Math.max(0, repeatNum))
* param {Number} beginLen 字符串头显示位数
* param {Number} endLen 字符串尾显示位数
* param {Number} max 默认值 999 * 显示最大数目
* */
function getStr (beginLen, endLen, max=999) {
  // 这里用了闭包,闭包用完后需手动开释内存
  return function (str) {const firstStr = str.substr(0, beginLen)
    const lastStr = endLen == 0 ? '' : str.substr(endLen)
    let repeatNum = Math.max(0, str.length - (beginLen + Math.abs(endLen)))
    repeatNum = Math.min(max, repeatNum)
    const middleStr = '*'.repeat(repeatNum)
    return firstStr + middleStr + lastStr
  }
}
/*
昵称脱敏规定
1 个字符:显示
2 个字符:首字符 +*(王雨 显示 王 *)3 个字符:首字符 +*+ 开端字符(王哈呀 显示 王 * 呀)4 个字符:首 2 字符 +**+ 开端字符(yhzj 显示 yh*j)5 个字符:首 2 字符 +*+ 开端 2 字符(王语嫣要得 显示 王语 * 要得)6 个字符:首 2 字符 +**+ 开端 2 字符(天天开心小野 显示 天天 ** 小野)大于 6 个字符:首 2 字符 +***+ 开端 2 字符(天天开心呀小野 显示 天天 *** 小野)*/
let getName = (str) => {
  let getResult = null
  switch (str.length) {
    case 1:
    case 2:
      getResult = getStr(1, 0)
      break
    case 3:
      getResult = getStr(1, -1)
      break
    case 4:
      getResult = getStr(2, -1)
      break
    default:
      getResult = getStr(2, -2, 3)
      break
  }
  const result = getResult(str)
  getResult = null // 闭包 - 需手动开释
  return result
}
console.log(getName('王'))
console.log(getName('王语'))
console.log(getName('王语语'))
console.log(getName('王嘻嘻嘻'))
console.log(getName('王嘻嘻嘻呀'))
console.log(getName('天天开心小野'))
console.log(getName('天天开心小野人'))
console.log(getName('天天开心小野人呀'))
console.log(getName('天天开心小野人呀天天开心小野人呀'))
let getPhone = getStr(3, -4)
let getIdCard = getStr(6, -4)
let getBankCard = getStr(6, -4)
console.log(getPhone(`18888888888`))
console.log(getIdCard(`500106197003039999`))
console.log(getBankCard(`6227000000000000001`))
// 闭包 - 需手动开释
getPhone = null
getIdCard = null
getBankCard = null
退出移动版