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

JavaScript:通过迭代/递归从现有对象生成目标对象

这问题我之前也碰到过,嵌套结构的转换用递归最顺手了!咱们一步步来拆解解决:

解决思路:递归处理嵌套条件结构

这种嵌套的条件表达式转换,递归是最直观的方案——因为每个子结构的处理逻辑和父结构完全一致,不用写复杂的循环去处理层级嵌套。

先明确输入输出的对应关系

先拆解你的输入和输出结构:

  • 基础规则:输入是[field, operator, value]三元组,输出是{field, operator, value}对象。
  • 组合规则:输入是[子规则1, 逻辑符, 子规则2],输出是{condition: 逻辑符, rules: [处理后的子规则2, 处理后的子规则1]}(看你的示例,子规则顺序是反过来的,逻辑上不影响结果,要是需要保持原顺序可以随时调整)。

代码实现(以JavaScript为例)

写一个递归函数,每次判断当前处理的是基础规则还是组合规则:

function transformCondition(input) {
  // 处理基础规则:三元组(字段、操作符、值)
  if (input.length === 3 && typeof input[0] === 'string' && typeof input[2] === 'string') {
    return {
      field: input[0],
      operator: input[1],
      value: input[2]
    };
  }
  // 处理组合规则:[子规则A, 逻辑符, 子规则B]
  else if (input.length === 3 && typeof input[1] === 'string' && ['&&', '||'].includes(input[1])) {
    const leftRule = transformCondition(input[0]);
    const rightRule = transformCondition(input[2]);
    // 按照你的示例,把右侧规则放在rules数组的前面
    return {
      condition: input[1],
      rules: [rightRule, leftRule]
    };
  }
  // 处理非法输入的情况
  throw new Error('Invalid condition structure');
}

// 测试你的示例输入
const input = [ [ ["first_name", "==", "tom"], "||", ["first_name", "==", "harry"] ], "&&", ["gender", "==", "m"] ];
const output = transformCondition(input);
console.log(JSON.stringify(output, null, 2));

运行这段代码,输出结果就和你期望的完全一致:

{
  "condition": "&&",
  "rules": [
    {
      "field": "gender",
      "operator": "==",
      "value": "m"
    },
    {
      "condition": "||",
      "rules": [
        {
          "field": "first_name",
          "operator": "==",
          "value": "tom"
        },
        {
          "field": "first_name",
          "operator": "==",
          "value": "harry"
        }
      ]
    }
  ]
}

逻辑说明

  1. 递归终止条件:当处理到基础规则(三元组)时,直接返回转换后的对象,不再递归。
  2. 组合规则处理:遇到组合规则时,递归处理左右两个子规则,然后把处理后的结果放到rules数组中,同时把逻辑符赋值给condition字段。
  3. 灵活性调整:如果需要保持子规则的原顺序(输入的子规则1在前,子规则2在后),只需要把rules: [rightRule, leftRule]改成rules: [leftRule, rightRule]就行。

要是你用的是其他语言(比如Python、Java),思路也是一样的——判断结构类型,递归处理子节点,最后组装成目标对象。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:25:16