字符串处理

解析 URL Params 为对象

let url = 'http://www.domain.com/?user=anonymous&id=123&id=456&city=%E5%8C%97%E4%BA%AC&enabled';
parseParam(url)
/* 结 果
{ user: 'anonymous',
id: [ 123, 456 ], // 重复出现的 key 要组装成数组,能被转成数字的就转成数字类型
city: '北京', // 中⽂需解码
enabled: true, // 未指定值得 key 约定为 true
}
*/
// 解析URL Params为对象

/* 结 果
{ 
    user: 'anonymous',
    id: [ 123, 456 ], // 重复出现的 key 要组装成数组,能被转成数字的就转成数字类型
    city: '北京', // 中⽂需解码
    enabled: true, // 未指定值得 key 约定为 true
}
*/

// encodeURIComponent() 编码
// decodeURIComponent() 解码
let url = 'http://www.domain.com/?user=anonymous&id=123&id=456&city=%E5%8C%97%E4%BA%AC&enabled'
let targetObj = parseParam(url);
console.log(targetObj)

function parseParam (url) {
    const paramsStr = /.+\?(.+)$/.exec(url)[1]; // 将 ? 后⾯的字符串取出来
    const paramsArr = paramsStr.split('&'); // 将字符串以 & 分割后存到数组
    let paramsObj = {};
    // 将 params 存到对象中
    paramsArr.forEach(param => {
        if (/=/.test(param)) { // 处理有 value 的参数
            let [key, val] = param.split('='); // 分割 key 和 value
            val = decodeURIComponent(val); // 解 码
            val = /^\d+$/.test(val) ? parseFloat(val) : val; // 判断是否转为数字
            if (paramsObj.hasOwnProperty(key)) { // 如果对象有 key,则添加⼀个值
                paramsObj[key] = [].concat(paramsObj[key], val);
            } else { // 如果对象没有这个 key,创建 key 并设置值
                paramsObj[key] = val;
            }
        } else { // 处理没有 value 的参数
            paramsObj[param] = true;
        }
    })

    return paramsObj;
}

模板引擎实现

// 模板引擎实现
let template = '我是{{name}},年龄{{age}},性别{{sex}}'
let data = {
    name: '姓名',
    age: 18
}
let result = render(template, data); // 我是姓名,年龄18,性别undefined
console.log(result);

function render (template, data) {
    const reg = /\{\{(\w+)\}\}/; // 模板字符串正则
    if (reg.test(template)) { // 判断模板⾥是否有模板字符串
        const name = reg.exec(template)[1]; // 查找当前模板⾥第⼀个模板字符串的字段
        template = template.replace(reg, data[name]); // 将第⼀个模板字符串渲染
        return render(template, data); // 递归的渲染并返回渲染后的结构
    } else {
        return template;
    }
}

查找字符串中出现最多的字符和个数

// 查找字符串中出现次数最多的字符

let str = "abcabcabcbbccccc";
let num = 0;
let char = '';
// 使其按照⼀定的次序排列
str = str.split('').sort().join('');

// \1等于()中匹配的内容
// 定义正则表达式,目的是筛选出相同的字符
let re = /(\w)\1+/g;
str.replace(re, ($0, $1) => {
    if (num < $0.length) {
        num = $0.length;
        char = $1;
    }
})

console.log('字符串中出现次数最多的字符是'+char+',出现次数为'+num)

字符串查找

a='34';b='1234567'; // 返 回 2
// a='35';b='1234567'; // 返 回 -1
// a='355';b='12354355'; // 返 回5
let targetIndex = isContain(a, b);
console.log(targetIndex)

function isContain (a,b) {
    for (let i in b) {
        if (a[0] === b[i]) {
            let tmp = true;
            // 字符串转换成数字 可以用 ~~
            for (let j in a) {
                if (a[j] !== b[~~i + ~~j]) {
                    tmp = false;
                }
            }
            if (tmp) {
                return i
            }
        }
    }
    return -1
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值