38、 敏感信息星号显示

136 阅读1分钟
   * 敏感信息星号显示
   * @param {String} value
   * @param {Number} start // 前N位
   * @param {Number} end // 后N位
   * @param {Boolean} isFixed // 固定(不进行字符长度与明文长度的自适应)
   */
  function asterisk (value, start = 3, end = 4, isFixed = false) {
    // 电话邮箱等数值类型转换成字符类型
    value = value ? value.toString() : ''
    // 无牌车,扫码无牌车不加密
    if (value.indexOf('无牌车') !== -1) {
      return value
    }
    if (+localStorage.getItem('ipmsIsEncrypt') && value) {
      const len = value.toString().length
      if (len === 1) {
        return '*'
      } else if (len === 2) {
        return value.replace(/[\s\S]$/, '*')
      } else {
        let before = start
        let after = end
        if (!isFixed) {
          const commonCount = before + after
          const asteriskCount = len - commonCount
          if (asteriskCount <= 0) {
            if (len <= 6) {
              before = 1
              after = 1
            } else {
              before = after = Math.floor(commonCount / 2) - 1
            }
          } else if (asteriskCount < commonCount / 2) {
            before = after = Math.floor(commonCount / 2) - 1
          }
        }
        const reg = new RegExp(`([\\s\\S]{${before}})[\\s\\S]*([\\s\\S]{${after}})`)
        let asteriskStr = new Array(len - before - after + 1).join('*')
        if (asteriskStr.length > 6) {
          asteriskStr = '******'
        }
        return value.replace(reg, `$1${asteriskStr}$2`)
      }
    }
    return value
  }

asterisk("浙123456") asterisk("15734555259")