I made this code trying to reproduce what i want to do in my Node JS API. I have “message” Array and “valueList” Object and i need to replace all text with “@” than have name of variables in “valueList” Object.
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)
If i create one more variable in valueList i need to put one more .map in message, is possible to get automatically all object to replace all “message” ? i’m trying to do that, Thanks.
Advertisement
Answer
Another option is to create a dynamic regex with a capture group, and use an alternation |
joining the keys from Object.keys(valueList)
and use replace with a function.
In the replace function, you an index into the valueList
object using the value of group 1 which will be either myname or myname or botname
The assembled regex looks like this and uses the global flag to replace all occurrences.
@(myname|city|botname)b
The pattern matches:
@
Match literally(myname|city|botname)
Capture group 1, match any of the alternatives (referenced byg1
in the code for the replacement)b
A word boundary to prevent a partial match
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" } const replacedText = message.map(s => s.replace( new RegExp(`@(${Object.keys(valueList).join('|')})\b`, 'g'), (_, g1) => valueList[g1] ) ); console.log(replacedText)