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" 
    }
}