【JS】简单实现一个引擎模板

前言

这两天在做数据处理的工作,最初是简单粗暴直接拼接字符串,数据量少时还没发现什么问题。当数据多时,拼接的自己都闲麻烦的。想到了使用了模板来处理,简单方便,再也不用使用一堆的加号了。简单看下实现吧。

模板和数据源
//模板
var ph = 'this is a ${type} , made in ${msg.date} and imagepath is ${msg.imagepath}';
//数据源
var item = {type:'process',msg:{date:'2018-4-17',imagepath:'java.exe'}};

目标:
将数据源中的数据替换到模板字符串中,得到最终的输出为:

this is a process , made in 2018-4-17 and imagepath is java.exe

实现

原理很简单,就是匹配模板的被${}包裹的内容,对应的将数据源置换到里面。

/**
 * 递归读取嵌套对象中的值
 * 
 * @param {Object} item 对象 {type:'process',msg:{date:'2018-4-17',content:'test'}}
 * @param {Array} vars key值 ['msg','content']
 * @param {int} i key值数组的下标
 */
function getValue(item, vars, i) {
    if (i === vars.length - 1) {
        return item[vars[i]];
    }
    if (item && item[vars[i]]) {
        return getValue(item[vars[i]], vars, ++i);
    } else {
        return null;
    }
}

/**
 * 模板解析
 * 
 * @param {Object} item 待替换数据
 * @param {String} placeHolder 字符串模板
 */
function replacePlaceHolder(item, placeHolder) {
    return placeHolder.replace(/\$\{([\w\.]+)\}/g, function (word, key) {
        if (key && item) {
            let vars = key.split('.');
            return getValue(item, vars, 0);
        } 
        return null;
    });
}

通过replace可以简单匹配到被${}包裹的字符串,再通过递归的查找数据源中的数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

逛街的猫啊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值