I have a situation where I have an array of objects like this:
[ { "name": "Phone call", "value": "Phone call" }, { "name": "SMS", "value": "SMS" }, { "name": "Email", "value": "Email" } ]
I have to remap the above OBJ to a new one containing its translation which is similar to this from React-intl: formatMessage(formatMessage(messages.emailOptionPlaceholder)
And the idea is as follow:
if (obj.name === 'Email') formatMessage(formatMessage(messages.emailOptionPlaceholder) else obj.name
so the new array should contain the right translation which will populate a dropdown menu.
I tried so far like this but without success:
field.options.map(o => { return [ o.name === 'Email' ? formatMessage(messages.emailOptionPlaceholder) : o.name, o.name === 'Phone call' ? formatMessage(messages.phoneOptionPlaceholder) : o.name, o.name === 'SMS' ? formatMessage(messages.smsOptionPlaceholder) : o.name, ]; });
This gives back 3 arrays instead of one with the values I need.
My goal is to have an array containing the formatMessage(...)
output for the 3 elemnts inside the object as example of the output:
[{ name: Phone call value: <-- Phone call translation from formatMessage --> } { name: Email value: <-- Email translation from formatMessage --> } { name: SMS value: <-- SMS call translation from formatMessage --> } ]
I’m getting that OBJ from back-end and need to put the translation of corresponding name inside a drop down menu and was wondering what solution can be better.
Advertisement
Answer
I would do it something like this. (not tested)
const mappings = { 'Email': messages.emailOptionPlaceholder, 'Phone call': messages.phoneOptionPlaceholder, 'SMS': messages.smsOptionPlaceholder }; const mapped = field.options.map((obj) => { const key = mappings[obj.name] if (key) { return { ...obj, value: formatMessages(key) } } else { // no mapping for object name. // do something to handle it or just return obj return obj } }
If you are only interested in the values you can do this.
const mappings = { 'Email': messages.emailOptionPlaceholder, 'Phone call': messages.phoneOptionPlaceholder, 'SMS': messages.smsOptionPlaceholder }; const mapped = field.options.map((obj) => { const key = mappings[obj.name] return formatMessages(key) || key // }