如何实现一个简单的模板字符串填充方法

由 漆黑菌 于 2018年11月30日 发布

题目要求

提供一个摸板字符串和一组数据,返回一个渲染完毕的字符串。

方法一:用解析字符串,提取关键字,用关键字去data中取数据。

    let data:object = {
        name:'二狗',
        sex:'男'
    }
    let str: string = '姓名:${name},性别:${sex},年龄:${age}'
    
    function strParse(str: string, data: object) {
        let start: number = str.indexOf('${')
        let end: number = str.indexOf('}')
        let arg = str.slice(start + 2, end)
        if(data[arg]===undefined){
            throw `${arg} is not defined!`
        }
        str = str.replace('${' + arg + '}', data[arg])
        if (str.indexOf('${') > -1) {
            return strParse(str, data)
        } else {
            return str
        }
    }
    console.log(strParse(str, data))

方法二:循环data生成关键字,然后根据关键字去替换str中的对应字符串

    function strParse2(str: string, data: object) {
        for(let key in data){
            str = str.replace('${'+key+'}',data[key])
        }
        findUndefinedData(str)
        return str
    }
    function findUndefinedData (str:string,startFlag:number=0,endFlag:number=0) {
        let start: number = str.indexOf('${',startFlag)
        let end: number = str.indexOf('}',endFlag)
        if(start>-1||end>-1){
            let keyStr = str.slice(start+2,end)
            console.error(`${keyStr} is not defined!`)
            return findUndefinedData(str,start+1,end+1)
        } else {
            return false
        }
    }
    console.log(strParse2(str, data))

第二问要求是遇到模板中有,但是data中没有的数据需要给出异常提示。 此时第一种方法就比较好处理了,判断根据模板关键字取出的数据是不是undefined就行了。第二种要专门去写个方法去搜索未被替换的字符,然后抛出异常。