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" } ] } ] }
逻辑说明
- 递归终止条件:当处理到基础规则(三元组)时,直接返回转换后的对象,不再递归。
- 组合规则处理:遇到组合规则时,递归处理左右两个子规则,然后把处理后的结果放到
rules数组中,同时把逻辑符赋值给condition字段。 - 灵活性调整:如果需要保持子规则的原顺序(输入的
子规则1在前,子规则2在后),只需要把rules: [rightRule, leftRule]改成rules: [leftRule, rightRule]就行。
要是你用的是其他语言(比如Python、Java),思路也是一样的——判断结构类型,递归处理子节点,最后组装成目标对象。
内容的提问来源于stack exchange,提问作者Gogol
相关产品推荐
相关产品推荐

