编辑代码

 function compile(str, obj){
    const reg = /\$\{(.+?)\}/
    if(reg.test(str)){
        str = str.replace(reg,(...arg)=>{
            // console.log(arg[1].toString())

            return getValue(obj,arg[1] )
        })
        return compile(str, obj)
    }else{
        // console.log(str)
        return str
    }
}

function getValue(obj, key){
    let t = key.split(".")
    // console.log(t)
    let res = obj
    const arrReg  = /(\w+)\[(.+)\]/
    for(let a of t){
        // console.log(a)
        if(arrReg.test(a)){
            // console.log(a)
           res =  res[a.match(arrReg)[1]][a.match(arrReg)[2]]
            // console.log(res+"66")
        }else{
            res = res[a]
            // console.log(res+"66")
        }
    }
    return res

}
const obj = {
    b:"world",
    ddd:[
        {
            e:"I"
        }
    ],
    ff:{
        g:"like"
    }
}

const str = "Hello ${b},${ddd[0].e} ${ff.g} $!"
console.log(compile(str, obj))
// console.log(obj.ff.g)
console.log(obj['ddd'])

console.log(/(\w+)\[(.+)\]/.test("ddd[0]"))