Typescript 从字符串中提取多个{fieldName}以创建值哈希映射
我在打字脚本中得到了一个简单的情况 我有一个模型,里面有一些字符串 比如说Typescript 从字符串中提取多个{fieldName}以创建值哈希映射,typescript,Typescript,我在打字脚本中得到了一个简单的情况 我有一个模型,里面有一些字符串 比如说 let message = 'Updated user {userName}. Set new name {newName} instead of old {oldName}.' 当前,这些字段的实际值存储在this.fields属性中 我们正在进行内联替换以返回“已填充”的消息文本。使用类似于: replaceFields(message): string { return Object.keys(this.
let message = 'Updated user {userName}. Set new name {newName} instead of old {oldName}.'
当前,这些字段的实际值存储在this.fields
属性中
我们正在进行内联替换以返回“已填充”的消息文本。使用类似于:
replaceFields(message): string {
return Object.keys(this.fields).reduce((currentMessage, field) => {
let values: String[] = this.fields[field];
if (values) {
return currentMessage.replace(`{${field}}`, values.join(', '));
} else {
return currentMessage;
}
}, message);
}
为了翻译的需要,我们需要用另一种方式做事情
我们不希望替换内联,而是返回类似以下内容的内容:
message = {
text: 'Updated user {userName}. Set new name {newName} instead of old {oldName}.',
values: {
userName: 'actual_username',
newName: 'bob',
oldName: 'jack'
}
}
因此,我们可以使用angular ngx translate第三方,然后在管道中使用:
mymessage:{{message.text | translate:values}}
我是Typescript新手,我不知道如何从字符串中提取字段名,然后简单地将它们添加到
值对象中。我会使用正则表达式从消息字符串中获取所有值,然后使用它们创建一个对象。以下示例将使用正则表达式查找大括号内的所有字符串,然后在fields对象中搜索这些字符串:
class Message {
constructor(public text: string, public values: any) { };
}
function GetMessage(text: string, fields: any): Message {
let values: any = {};
let regex: RegExp = new RegExp(/{(.*?)}/g);
let match: RegExpExecArray;
while (match = regex.exec(text)) {
let field = match[1];
values[field] = fields[field] ? fields[field].join(', ') : '';
}
return new Message(text, values)
}
let fields: any = { userName: ['theUser'], newName: ['theNew'], oldName: ['theOld'] };
let str = 'Updated user {userName}. Set new name {newName} instead of old {oldName}.';
let msg = GetMessage(str, fields);
console.log(msg);
控制台记录此输出:
msg : Object {
text : "Updated user {userName}. Set new name {newName} instead of old {oldName}."
values : Object {
userName: "theUser",
newName: "theNew",
oldName: "theOld"
}
}