【问题标题】:String to template string for array of object mapping对象映射数组的字符串到模板字符串
【发布时间】:2021-11-23 09:08:08
【问题描述】:

从 API 数据的某个地方,我得到了正常的字符串,例如“Hi ${person[0].name}”,现在我将这个字符串转换为模板字符串并从对象数组中替换它的变量。

这是我正在尝试执行的 sn-p,但我没有得到预期的输出

const getObjPath = (path, obj, fallback = `$\{${path}}`) => {
    if (path && obj) return path.split('.').reduce((res, key) => res[key] || fallback, obj);
    return path;
};
const interpolate = (template, variables, fallback) => {
    const regex = /\${[^{]+}/g;
    if (template && variables) {
        return template.replace(regex, (match) => {
            let path = match.slice(2, -1).trim();
            path = path.split('|').map((item) => item.trim());
            const fieldValue = getObjPath(path[0], variables, fallback);
            if (fieldValue) return fieldValue;
            return path[1] || fallback;
        });
    }
    return template;
};

const data = { person: [{ name: 'John', age: 18 }] };
const a = interpolate('Hi ${person?.[0]?.name | text} (${person?.[0]?.age | text})', data);
console.log(a);

输出:"Hi ${person?.[0]?.name} (${person?.[0]?.age})"

预期输出:"Hi John 18"

谁能告诉我我在这里做错了什么?

【问题讨论】:

    标签: javascript ecmascript-6 string-interpolation template-strings


    【解决方案1】:

    问题是您在getObjPath 中的路径拆分不处理路径中的方括号。

    所以替换这个

    path.split('.')
    

    与:

    path.match(/[^.[\]]+/g)
    

    const getObjPath = (path, obj, fallback = `$\{${path}}`) => {
        if (path && obj) return path.match(/[^.[\]]+/g).reduce((res, key) => res[key] || fallback, obj);
        return path;
    };
    const interpolate = (template, variables, fallback) => {
        const regex = /\${[^{]+}/g;
        if (template && variables) {
            return template.replace(regex, (match) => {
                let path = match.slice(2, -1).trim();
                path = path.split('|').map((item) => item.trim());
                const fieldValue = getObjPath(path[0], variables, fallback);
                if (fieldValue) return fieldValue;
                return path[1] || fallback;
            });
        }
        return template;
    };
    
    const data = { person: [{ name: 'John', age: 18 }] };
    const a = interpolate('Hi ${person[0].name | text} (${person[0].age | text})', data);
    console.log(a);

    【讨论】:

    • 对不起@trincot,我错过了我也在使用 elvis ${person?.[0]?.name}
    • 好的,但这不是你的问题。关于为什么什么都没有改变的问题已经得到解答。现在您应该尝试实现处理?. 的逻辑。如果您在这样做时遇到问题,请随时提出有关该方面的新问题。但你至少应该付出努力。
    猜你喜欢
    • 2018-05-29
    • 2021-11-15
    • 1970-01-01
    • 1970-01-01
    • 2012-01-23
    • 1970-01-01
    • 1970-01-01
    • 2017-07-28
    • 2014-10-31
    相关资源
    最近更新 更多