JS/信息替换函数

字符串替换函数

  • 说明:将指定字符串中某部分字符替换成指定字符。
  • 复制函数,直接使用即可

函数

/**
 * @description 前端将指定符号星号隐藏,默认方法则是常用的分割手段,可以自定义分割位置
 * @todo 此函数将会将调用着传入的字符串或数组对象参数进行一个指定位置替换指定字符,如:张三替换成 张*
 * @method split_secret
 * @author { JF-kuku }
 * @param { String<>Number } secret 要分割替换的数据
 * @param { Number } sSplit 起始分割位 # 不允许使用负数, 0 - ∞,
 * @param { Number } eSplit 结尾分割位 # 正数超过字符串本身长度且未指定插入字符长度则会延长占位符号长度, 负数无法超过总长度减去前置位数,否则报错
 * @param { String } shape 要指定使用占位的符号,默认使用星号
 * @param { Number } star 要分割占位的符号数
 * @param { String } type 指定使用提供的默认分割方法
 * @example 
 * split_secret({'secret': name, 'type': 'name'})
 * name / 默认居中
 * phone / 默认前三后四
 * code / 身份证 前六位为地区标识 中8位为出生标识 后四位为唯一标识,建议遮盖后十二位
 * card / 保留前后一位
 * ident / 标识 如果传入对象则会使用标识,标识中应存在指定key的不同操作,比如name操作/ phone操作, 不存在则无需传入规则,但不要进行无意义函数调用
 * @example  
 * { 示例
 *  name: [0,3,1,'*'] 0:前置 1:后置 2:数量 3:符号
 *  phone: [3,7]
 * }
 * @returns {String<>Number}
 * @throws
 *  如果未传入一个null, '', 空数组等等 凡是被js取反判定为false的均会抛出:`Input a data value exception! Please guarantee this value is correct parameter!
 *  如果前置分割数小于0 均会抛出:Input a front split value exception! Please guarantee this value is correct parameter!
 * @org 某不知名组织
 */
function split_secret(obj, ident) { // indent 指定规则进行分割, // 1000L 6ms - 8ms
	let a = { // 字符串默认规则
		secret: "", // 分割数据
		shape: "*", // 分割占位符
		shapenum: 0, // 占位符数量
		sSplit: 0, // 开始保留到第几位 默认保留前1后1
		eSplit: 0, // 结尾保留到第几位
		type: "diy",
	};
	a = { ...a, ...obj };
	if (!a.secret) throw Error(`Input a data value exception! Please guarantee this value is correct parameter!`);
	if (Object.prototype.toString.call(a.secret) == "[object Array]") {
		try {
			let cloneData = a.secret;
			for (let val of cloneData) {
				for (let key in val) {
					if (ident.hasOwnProperty(key)) { // 当存在配置的key时,则使用这个key的规则进行分割
						a.sSplit = ident[key][0] || 0; // 前置分割
						a.eSplit = ident[key][1] || 0; // 后置分割
						a.shapenum = ident[key][2] || 0; // 分割数
						a.shape = ident[key][3] || "*"; // 分割符
						a.secret = val[key] // 分割数据
						val[key] = autoConvert();
					}
				}
			}
			return cloneData;
		} catch (err) {
			throw Error(err);
		}
	} else { // 针对字符串返回
		return a.type == 'name' ? (a.sSplit = 1, autoConvert()) :
			a.type == 'mobile' ? (a.sSplit = 3, a.eSplit = 7, autoConvert()) :
			a.type == 'code' ? (a.sSplit = 6, autoConvert()) :
			a.type == 'card' ? (a.sSplit = 1, a.eSplit = -1, autoConvert()) : autoConvert();
			// a.type == 'code' ? (a.secret.replace(a.secret.slice(6, 18), a.shape.repeat(a.shapenum))) :
	}
	function autoConvert() {
		if (a.sSplit < 0) throw Error("Input a front split value exception! Please guarantee this value is correct parameter!");
		let first = a.secret.slice(0, a.sSplit);
		let second = a.eSplit && a.secret.length > 2 ? a.secret.slice(a.eSplit) : ''; // 如果末尾不要的则填0即可
		let emptyNum = a.eSplit > 0 ? a.eSplit - a.sSplit : a.secret.length - (a.sSplit + Math.abs(a.eSplit)) || 1;
		return first + (a.shapenum ? a.shape.repeat(a.shapenum) : a.shape.repeat(emptyNum)) + second;
	}
}

使用方法

let { log } = console;
let name = "慕容符"; // 姓名
log("string:姓名->", split_secret({'secret': name, 'type': 'name', }));
let code = "000000111122223333"; // 身份证
log("string:身份证->", split_secret({'secret': code, 'type': 'code'}));
let mobile = '15100000000'; // 手机号码
log("string:手机号码->", split_secret({'secret': mobile, 'type': 'mobile'}));
let diy = "diy"; // 自定义截取规则
log("string:自定义-> ", split_secret({'secret': name, sSplit: 1, eSplit: -1})); // 注:至少需要的参数为,secret/操作数据,sSplit/前置分割, eSplit/后置分割

let userInfo = [
	{
		'name': '慕容符',
		'mobile': '15100000000',
		'code': '000000111122223333',
		'card': 'V1110000555'
	},
	{
		'name': '张三',
		'mobile': '13300000000',
		'code': '000000111122223333',
		'card': 'V1110000666'
	}
];
let ident = { // 参数: 0:前置分割规则, 1:后置分割 2. 分割数量 3.分割符号 / 注意,数据中要分割的key叫什么,这里规则的key就叫什么
	name: [1], // 名称
	mobile: [3, 7, 4, 'x'], // 手机号码
	code: [6, 18], // 身份证
	card: [1, -1, '', '?'] // 卡号 # 默认数量使用空占位
}
log("对象数组:所有用户信息->", split_secret({'secret': userInfo}, ident));
  • 结果
    <!-- 坐而论道易,起而行之难。 -->
posted @ 2022-01-16 15:55  千万不要学前端呀  阅读(130)  评论(0)    收藏  举报