从字符串中提取多个{fieldName}以创建值hashmap

时间:2017-09-05 17:10:56

标签: typescript

我在打字稿中得到了一个简单的情况。

我有一个带有一些字符串的模型。

例如

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

所以我们可以使用角度ngx-translate第三方,然后在管道中使用:

My message: {{message.text |translate:values}}

我在Typescript中很新,我不知道如何从字符串中提取fieldNames,然后只需将它们添加到values对象中。

1 个答案:

答案 0 :(得分:1)

我会使用正则表达式从消息字符串中获取所有值,然后使用它们来创建对象。以下示例将使用正则表达式查找大括号内的所有字符串,然后在字段对象中搜索它们:

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