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

如何在JavaScript中为括号访问的字符串添加可选链?

解决可选链自动添加的正则问题

要同时支持点符号和括号形式的属性访问,且保留原有括号不被删除,我们可以调整正则表达式,通过分支匹配+替换函数来分别处理两种场景:

修改后的实现代码

const inputs = [
  'foo.bar',        // foo?.bar
  'foo.bar.baz',    // foo?.bar?.baz
  'foo.bar.baz.go', // foo?.bar?.baz?.go
  'foo[0].bar',     // foo?.[0]?.bar
  'foo.bar[0]',     // foo?.bar?.[0]
  'foo.bar[0].bla', // foo?.bar?.[0]?.bla
  'foo',            // foo
  'foo.bar[text].some.bla[0]', // foo?.bar?.[text]?.some?.bla?.[0]
  "foo?.you['text'][text].some[0].bla", // foo.you?.['text']?.[text]?.some?.[0]?.bla
];

// 匹配两种场景:1. 无前置?的.\w+ 2. 无前置?的[
const regex = /(?<!\?)(?:(\.)(\w+)|(\[))/g;

const outputs = inputs.map(input => 
  input.replace(regex, (match, dot, prop, bracket) => {
    if (dot) {
      // 处理点访问:将 .prop 替换为 ?.prop
      return `?.${prop}`;
    } else if (bracket) {
      // 处理括号访问:将 [ 替换为 ?.[
      return `?.[`;
    }
    return match;
  })
);

console.log(outputs);

正则表达式解释

  • (?<!\?):负向预查,确保当前匹配的内容前面没有已经存在的?,避免重复添加可选链
  • (?:(\.)(\w+)|(\[)):非捕获分组,包含两个分支:
    • (\.)(\w+):捕获点符号和后续的属性名,用于处理foo.bar这类场景
    • (\[):捕获括号访问的左括号,用于处理foo[0]这类场景

替换逻辑说明

通过替换函数区分两种匹配结果:

  • 如果匹配到点符号分支(dot存在),则将.prop替换为?.prop
  • 如果匹配到括号分支(bracket存在),则将[替换为?.[,保留原有括号内的内容

内容的提问来源于stack exchange,提问作者Jon Sud

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 21:21:48