跳至主要內容

stringUtils

chanchaw大约 3 分钟javascript

序列化为字符串

// 将基本数据类型、对象等序列化为字符串
function serialize(value, parents = []) {
    // 处理基本类型和特殊值
    if (value === null) return 'null';
    if (value === undefined) return 'undefined';
    
    const type = typeof value;
    
    // 基本类型快速处理
    if (type === 'string') {
        // 转义双引号和反斜杠等字符
        return '"' + value.replace(/[\\"]/g, '\\$&').replace(/\n/g, '\\n').replace(/\r/g, '\\r').replace(/\t/g, '\\t') + '"';
    }
    if (type === 'number') {
        if (isNaN(value)) return 'NaN';
        if (value === Infinity) return 'Infinity';
        if (value === -Infinity) return '-Infinity';
        return String(value);
    }
    if (type === 'boolean') return value ? 'true' : 'false';
    if (type === 'bigint') return value.toString() + 'n';
    if (type === 'symbol') {
        const desc = value.description ? value.description : '';
        return `Symbol(${desc})`;
    }
    if (type === 'function') {
        const name = value.name || 'anonymous';
        return `[Function: ${name}]`;
    }
    
    // 对象类型
    if (value && typeof value === 'object') {
        // 检测循环引用
        if (parents.includes(value)) {
            return '[Circular]';
        }
        
        // 处理支持 toJSON 方法的对象
        if (typeof value.toJSON === 'function') {
            return serialize(value.toJSON(), parents);
        }
        
        // 获取具体对象类型
        const objType = Object.prototype.toString.call(value);
        
        // Date
        if (objType === '[object Date]') {
            try {
                return `Date("${value.toISOString()}")`;
            } catch(e) {
                return `Date("${value.toString()}")`;
            }
        }
        
        // RegExp
        if (objType === '[object RegExp]') {
            return value.toString();
        }
        
        // Error
        if (objType === '[object Error]') {
            return `Error("${value.message}")`;
        }
        
        // Map
        if (objType === '[object Map]') {
            const newParents = [...parents, value];
            const entries = [];
            for (const [k, v] of value.entries()) {
                entries.push(`${serialize(k, newParents)} => ${serialize(v, newParents)}`);
            }
            return `Map{${entries.join(', ')}}`;
        }
        
        // Set
        if (objType === '[object Set]') {
            const newParents = [...parents, value];
            const items = [];
            for (const item of value) {
                items.push(serialize(item, newParents));
            }
            return `Set{${items.join(', ')}}`;
        }
        
        // Array
        if (Array.isArray(value)) {
            const newParents = [...parents, value];
            const items = [];
            // 处理稀疏数组
            for (let i = 0; i < value.length; i++) {
                if (i in value) {
                    items.push(serialize(value[i], newParents));
                } else {
                    items.push('empty');
                }
            }
            return `[${items.join(', ')}]`;
        }
        
        // 普通对象
        const newParents = [...parents, value];
        const keys = Object.keys(value);
        const props = [];
        for (const key of keys) {
            const propValue = value[key];
            // 避免输出过长或递归,直接序列化值
            props.push(`"${key}": ${serialize(propValue, newParents)}`);
        }
        // 可选:处理 Symbol 属性(默认不处理,若要启用取消注释)
        // const syms = Object.getOwnPropertySymbols(value);
        // for (const sym of syms) {
        //     const symKey = `Symbol(${sym.description || ''})`;
        //     props.push(`${symKey}: ${serialize(value[sym], newParents)}`);
        // }
        return `{${props.join(', ')}}`;
    }
    
    // 兜底处理(极少出现的情况)
    return String(value);
}


// 调用方法
serialize(各种类型的变量)

删除最后一个后缀

/**
 * 2021年7月4日 23:05:58
 * chanchaw
 * raw:传入原始字符串
 * suffix:字符串最后一个字符符合则删除后返回
 */
function removeSuffix(raw,suffix) {
  let str = raw.toString();
  if(str.substr(str.length-1,1)==suffix)
    str = str.substr(0,str.length-1)
  return str;
}

移除前后不可见字符

删除字符串首尾的不可见字符,保留中间的

// 移除字符串前后不可见字符,保留中间的任何字符
function trimInvisible(str) {
    // 匹配所有常见的空白字符(包括零宽空格等)
    return str.replace(/^[\s\uFEFF\u200B\u200C\u200D\u2028\u2029\u00A0]+|[\s\uFEFF\u200B\u200C\u200D\u2028\u2029\u00A0]+$/gu, '');
}

移除字符保留数字

const str = 'xieyezi 123123 to hao ffff22222';
const numbers = str.replace(/\D/g,'');

反转字符串

const sentence='abc 112233';
const reverseSentence=reverseBySeparator(sentence, "");
console.log(reverseSentence);// 332211 cba

const reverseEachWord = reverseBySeparator(sentence, " ");
console.log(reverseEachWord);// cba 332211

function reverseBySeparator(string, separator){
    return string.split(separator).reverse().join(separator);
}

填充到指定长度

/**
* 2021年7月4日 21:27:27
* chanchaw
* raw:原始字符串
* len: 要填充到的目标长度
* filler: 填充物
*/
function fillPrefix(raw,len,filler) {
  let tmp = raw.toString()
  tmp = tmp.padStart(len,filler)
  return tmp
}

英文首字母大写

const capitalize = str => str.charAt(0).toUpperCase() + str.slice(1)
    
capitalize("follow for more")
// Result: Follow for more

将下划线表名转换为小驼峰

// 将带有下划线的表名转换为小驼峰返回。传入:bill_code,返回 billCode
function smallCamel(tableName){
    const capitalize = (str)=> str.charAt(0).toUpperCase() + str.slice(1)
    const strArray = tableName.split('_')
    let ret = strArray[0]
    if(strArray.length>1){
        for(let i=1;i<strArray.length;i++){
            ret = ret + capitalize(strArray[i])
        }
    }
    return ret
}

取指定长度的随机字符串

const randomString13 = Math.random().toString(16).substring(2)// 13位
const randomString11 = Math.random().toString(36).substring(2) // 11位