在Object-Javascript中用respetive变量替换以“@”开头的文本

在Object-Javascript中用respetive变量替换以“@”开头的文本,javascript,node.js,arrays,object,replace,Javascript,Node.js,Arrays,Object,Replace,我编写了这段代码,试图重现我想在我的节点JSAPI中执行的操作。我有消息数组和valueList对象,我需要用@替换所有文本,而不是valueList对象中变量的名称 const message = [ "Hi my name is @myname from @city", "Hi i'm a bot @botname from @city" ] const valueList = { myname: "Roger&qu

我编写了这段代码,试图重现我想在我的节点JSAPI中执行的操作。我有消息数组和valueList对象,我需要用@替换所有文本,而不是valueList对象中变量的名称

const message = [
    "Hi my name is @myname from @city",
    "Hi i'm a bot @botname from @city"
]

const valueList = {
    myname: "Roger",
    city: "Rio",
    botname: "Re"
}

/** This is my trying */

const replacedText = message
    .map((text) => text.replace("@myname",valueList.myname))
    .map((text) => text.replace("@botname",valueList.botname))
    .map((text) => text.replace("@city",valueList.city))

console.log(replacedText)
若我在valueList中再创建一个变量,我需要在消息中再添加一个.map,是否可以自动获取所有对象以替换所有消息?我正试着这么做,谢谢

Object.keys(valueList).forEach((key) => {
   replacedText = message.replace('@'+key, valueList[key])
})
您还可以在valueList上使用reduce映射组合


您还可以在valueList上使用reduce map组合,您可以使用全局标志动态创建正则表达式,以便替换替换文本的多个实例示例:Hi my name是@city中的@myname@城市处于“状态”

常量消息=[ 嗨,我的名字是@city的@myname, 嗨,我是来自@city的机器人@botname ] 常量值列表={ 我的名字:罗杰, 城市:里约, 姓名:Re } //映射消息 const replacedText=message.maptext=>{ //映射要替换的键/值 return Object.keysvalueList.map //创建带有全局的regexp以替换多个(如果存在) key=>text.replacenew RegExp`@${key}`、'g',valueList[key] }
您可以使用全局标志动态创建正则表达式,以便替换替换文本的多个实例示例:Hi my name is@myname from@city@城市处于“状态”

常量消息=[ 嗨,我的名字是@city的@myname, 嗨,我是来自@city的机器人@botname ] 常量值列表={ 我的名字:罗杰, 城市:里约, 姓名:Re } //映射消息 const replacedText=message.maptext=>{ //映射要替换的键/值 return Object.keysvalueList.map //创建带有全局的regexp以替换多个(如果存在) key=>text.replacenew RegExp`@${key}`、'g',valueList[key] }
另一个选项是创建一个带有捕获组的动态正则表达式,并使用一个替代选项|连接Object.keysvalueList中的键并与函数一起使用

在replace函数中,可以使用组1的值(myname或myname或botname)向valueList对象创建索引

组装的正则表达式如下所示,并使用全局标志替换所有出现的正则表达式

@(myname|city|botname)\b
模式匹配:

@逐字匹配 myname | city | botname捕获组1,匹配替换代码中g1引用的任何备选方案 \b防止部分匹配的单词边界 常量消息=[ 嗨,我的名字是@city的@myname, 嗨,我是来自@city的机器人@botname ] 常量值列表={ 我的名字:罗杰, 城市:里约, 姓名:Re } const replacedText=message.maps=> s、 替换 新的RegExp`@${Object.keysvalueList.join'|'}\\b`、'g', _,g1=>valueList[g1] ;
console.logreplacedText另一个选项是创建一个带有捕获组的动态正则表达式,并使用另一个选项|连接Object.keysvalueList中的键并与函数一起使用

在replace函数中,可以使用组1的值(myname或myname或botname)向valueList对象创建索引

组装的正则表达式如下所示,并使用全局标志替换所有出现的正则表达式

@(myname|city|botname)\b
模式匹配:

@逐字匹配 myname | city | botname捕获组1,匹配替换代码中g1引用的任何备选方案 \b防止部分匹配的单词边界 常量消息=[ 嗨,我的名字是@city的@myname, 嗨,我是来自@city的机器人@botname ] 常量值列表={ 我的名字:罗杰, 城市:里约, 姓名:Re } const replacedText=message.maps=> s、 替换 新的RegExp`@${Object.keysvalueList.join'|'}\\b`、'g', _,g1=>valueList[g1] ;
这很聪明,我喜欢!这是非常聪明的,我喜欢它!