求助:实现JavaScript带默认值的{{变量}}字符串替换函数
完善后的变量替换函数
下面是实现了支持默认值的字符串变量替换功能的完整代码:
var insertReplacements = function (htmlStr, scope) { // 解析变量值:支持嵌套属性,优先从scope取,再取全局 function getVariableValue(varPath) { let current = scope; const segments = varPath.trim().split('.'); // 尝试从scope中查找 for (const segment of segments) { if (current && typeof current === 'object' && segment in current) { current = current[segment]; } else { current = undefined; break; } } // scope中找不到,尝试全局作用域 if (current === undefined) { current = globalThis; for (const segment of segments) { if (current && typeof current === 'object' && segment in current) { current = current[segment]; } else { current = undefined; break; } } } // 返回有效值,否则返回null return current !== undefined ? current : null; } return htmlStr.replace(/\{\{(.*?)\}\}/g, function (_match, sub) { const tokens = sub.split('||'); let value; for (const token of tokens) { const trimmedToken = token.trim(); // 处理带引号的字符串默认值 if (trimmedToken.startsWith('"') && trimmedToken.endsWith('"')) { return trimmedToken.slice(1, -1); } // 处理变量 value = getVariableValue(trimmedToken); if (value !== null) { return value; } } // 所有token都无效,返回空字符串 return ''; }); }; let works = "It_works"; let uu = { message: 'use this message here.', learnMore: 'learn more', link: 'dai sit ein link', target: '_self', markup: '{{uu.message}} test: {{works}} <a data-cc="uu.link" target="{{ uu.target }}" class="info" href="{{uu.link || "#null"}}">{{uu.learnMore}}</a>' }; let i = insertReplacements(uu.markup, uu) console.log("ii:",i)
关键实现说明
- 变量解析逻辑:
getVariableValue函数负责解析类似uu.message的嵌套变量路径,先从传入的scope对象中逐层查找属性,找不到则尝试全局作用域(比如works变量)。 - 默认值处理:按
||分割的顺序依次尝试每个token,找到第一个有效变量值或字符串默认值就返回。 - 字符串默认值:识别首尾带双引号的token,直接截取引号内的内容作为默认值返回。
输出结果
运行代码后,控制台输出将符合预期:
ii: use this message here. test: It_works <a data-cc="uu.link" target="_self" class="info" href="dai sit ein link">learn more</a>
注:原测试代码中的
{"works"}是无效语法,已修正为{{works}}以匹配期望结果。
内容的提问来源于stack exchange,提问作者hamburger
相关产品推荐
相关产品推荐

