You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:实现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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 16:33:32