创建字符串模板并替换为数组的内容

时间:2018-11-21 22:35:46

标签: javascript node.js

说我有一个像这样的字符串:

user@COMP:~$ sudo su -
root@COMP:~# cmd.exe /c echo works!            # merely for documentation
cmd.exe: command not found
root@COMP:~# echo "${#PATH}"                   # merely for documentation
70
root@COMP:~# cmd_path=`/mnt/c/Windows/System32/cmd.exe /C echo "%path:\\\\=\\\\\\\\%"`
root@COMP:~# OIFS="$IFS"                       # backup $IFS
root@COMP:~# IFS=';'
root@COMP:~# read -a c_p_n <<< "${cmd_path}"
root@COMP:~# IFS="$OIFS"                       # restore $IFS
root@COMP:~# OPATH="${PATH}"                   # backup  $PATH
root@COMP:~# for i in "${!c_p_n[@]}"; do PATH=${PATH%/}:$(sed -e 's#^\(.\):#/mnt/\L\1#' -e 's#\\#/#g' <<< "${c_p_n[$i]}"); done
root@COMP:~# echo "${#PATH}"                   # merely for documentation
1555
root@COMP:~# cmd.exe /c echo works!            # merely for documentation
works!

和类似的数组:

const m = 'Map<?,?>';

并且我希望生成:

const types = ['string', 'boolean'];

我该怎么做? 注意,我不需要在模板字符串中使用问号,我可以使用其他字符,也许像这样:

const r = 'Map<string,boolean>'

也请注意,因为我的模板未包装在函数中,因此我不能使用具有这种性质的{6} ES6模板字符串

我相信这将在Node.js中起作用:

const m = 'Map<%s,%s>';

但是我想我正在寻找一种使用问号字符(?)而不是使用%s的方法。

3 个答案:

答案 0 :(得分:4)

最小的方法可能是结合使用reducereplace

替换仅替换第一个找到的位置,而reduce可以轻松迭代给定的替换。

const m = 'Map<?,?>';

const types = ['string', 'boolean'];

const n = types.reduce((n, t) => n.replace('?', t), m);
console.log(n);

或将其形式化为功能:

function format(str, key, replacements){
    return replacements.reduce((s, t) => s.replace(k, t), str);
}

答案 1 :(得分:2)

您还可以直接使用replace()进行一些精美的关闭工作来捕获索引(可悲的是,该索引没有传递给replace回调函数):

const m = 'Map<?,?>';
const types = ['string', 'boolean'];

let rep = m.replace(/\?/g, ((i) => () => types[i++])(0)) // i is simple a count of matches starting at 0
console.log(rep)

如果立即执行的功能太怪异,则可以将整个内容包装为一个简单的函数,使您的眼睛更容易一些:

const m = 'Map<?,?>';
const types = ['string', 'boolean'];

function replaceMatch(str, arr){
    let i = 0
    return str.replace(/\?/g, () => arr[i++])
}

console.log(replaceMatch(m, types))

答案 2 :(得分:1)

您只需要一个?

const types = ['string', 'boolean'];

console.log('Map<?>'.split('?').join(types))

const types = ['string', 'boolean'];

console.log('Map<?>'.replace('?', types))

或者如果您希望保留?,?

const types = ['string', 'boolean'];

console.log('Map<?,?>'.replace('?,?', types))