@lx-frontend/multi-track
Version:
sls 日志上传功能,当前支持小程序、web
90 lines • 3.19 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.maskFieldInJsonStr = maskFieldInJsonStr;
function has(obj, path) {
if (!obj || typeof path !== 'string')
return false;
var keys = path.split('.');
var current = obj;
for (var _i = 0, keys_1 = keys; _i < keys_1.length; _i++) {
var key = keys_1[_i];
if (current == null || !(key in current)) {
return false;
}
current = current[key];
}
return true;
}
function set(obj, path, value) {
if (!obj || typeof path !== 'string')
return;
var keys = path.split('.');
var current = obj;
for (var i = 0; i < keys.length - 1; i++) {
var key = keys[i];
if (!(key in current) || typeof current[key] !== 'object' || current[key] === null) {
// 判断下一个 key 是不是数字,决定是数组还是对象
var nextKey = keys[i + 1];
current[key] = /^\d+$/.test(nextKey) ? [] : {};
}
current = current[key];
}
current[keys[keys.length - 1]] = value;
}
function isObject(val) {
return val !== null && typeof val === 'object';
}
/**
* 将 JSON 字符串中的指定 keyPath 替换成 maskValue,其他内容不变
* @param jsonStr 原始 JSON 字符串
* @param keyPaths 点分路径字符串,如 ["xxx.token", "xxx.mobile"]
* @param maskValue 替换值,默认是 "hidden"
* @returns 替换后的 JSON 字符串
*
* @example
* // 简单对象中隐藏字段
* maskFieldInJsonStr('{"name":"John","token":"secret123"}', ['token'])
* // => '{"name":"John","token":"hidden"}'
*
* // 嵌套对象中隐藏多个字段
* maskFieldInJsonStr(
* '{"user":{"name":"John","token":"secret123","contact":{"mobile":"13800138000"}}}',
* ['user.token', 'user.contact.mobile']
* )
* // => '{"user":{"name":"John","token":"hidden","contact":{"mobile":"hidden"}}}'
*
* // 数组对象中隐藏字段
* maskFieldInJsonStr(
* '{"users":[{"name":"John","token":"secret1"},{"name":"Jane","token":"secret2"}]}',
* ['users.0.token', 'users.1.token']
* )
* // => '{"users":[{"name":"John","token":"hidden"},{"name":"Jane","token":"hidden"}]}'
*
* // 复杂嵌套结构中隐藏字段
* maskFieldInJsonStr(
* '{"data":{"users":[{"id":1,"token":"secret1","profile":{"mobile":"13800138000"}},{"id":2,"token":"secret2"}]}}',
* ['data.users.0.token', 'data.users.0.profile.mobile', 'data.users.1.token']
* )
* // => '{"data":{"users":[{"id":1,"token":"hidden","profile":{"mobile":"hidden"}},{"id":2,"token":"hidden"}]}}'
*/
function maskFieldInJsonStr(jsonStr, keyPaths, maskValue) {
if (maskValue === void 0) { maskValue = 'hidden'; }
try {
var obj_1 = JSON.parse(jsonStr);
// 判断 obj 是否为对象
if (!isObject(obj_1)) {
return jsonStr;
}
// 隐藏字段
keyPaths.forEach(function (keyPath) {
if (has(obj_1, keyPath)) {
set(obj_1, keyPath, maskValue);
}
});
return JSON.stringify(obj_1);
}
catch (_err) {
return jsonStr;
}
}
//# sourceMappingURL=maskFieldInJsonStr.js.map