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

如何扁平化JavaScript AST中的链式赋值表达式序列

问题原因

你现有实现的问题在于仅生成了当前层级AssignmentExpression对应的赋值语句,没有收集嵌套在right属性中的其他AssignmentExpression的左值,因此最终只能输出一条赋值语句。

解决思路

  1. 遍历嵌套的AssignmentExpression结构,把所有层级的左节点全部收集到数组中
  2. 提取出最右侧非AssignmentExpression类型的最终右值
  3. 遍历收集到的所有左节点,每个都和最终右值生成独立的赋值表达式
  4. 返回所有生成的独立赋值表达式数组,替换原有的单个嵌套赋值节点

修改后代码

function normalize_AssignmentExpression(node, scope) {
  const [left, leftExps] = normalizeProperty(node.type, 'left', node.left.type, node.left, scope)
  let [right, rightExps] = normalizeProperty(node.type, 'right', node.right.type, node.right, scope)
  const exps = [
    ...leftExps,
    ...rightExps
  ]

  // 收集所有嵌套赋值的左节点,同时查找最终右值
  const allLefts = [left]
  let furthestRight = right
  while (furthestRight.type === 'AssignmentExpression') {
    allLefts.push(furthestRight.left)
    furthestRight = furthestRight.right
  }

  if (left.type === 'ArrayPattern') {
    // 原有数组解构逻辑保留
    const assignments = []
    left.elements.forEach(el => {
      assignments.push(
        createAssignmentExpression(
          el,
          createMemberExpression(right, el),
          node.operator
        )
      )
    })

    return [
      assignments,
      exps
    ]
  } else {
    // 为每个左值生成独立赋值语句
    const assignments = allLefts.map(leftItem => {
      return createAssignmentExpression(leftItem, furthestRight, node.operator)
    })
    return [
      assignments,
      exps
    ]
  }
}

经过上述修改后,原有的嵌套赋值AST会被拆为多个独立的赋值表达式节点,序列化后即可得到你需要的每行一条赋值语句的输出格式。

内容的提问来源于stack exchange,提问作者Lance Pollard

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 20:36:03