Node.js中处理对象字面量:替换键名及拆分RANGE操作符的实现问题
解决JSON过滤器转换的问题
首先,你的代码有两个关键问题需要修正:一是替换name为column的方式不对,二是处理RANGE操作符时没有更新原数组的元素。我来一步步帮你解决:
问题分析
name转column无效:你只是修改了循环中的prop变量名,但这并不会改变对象的实际属性键。你需要直接操作对象,把name的值赋给column,然后删除原name键。RANGE替换无法同步到原数据:你在函数里给obj赋值了新对象,但这只是修改了函数内部的局部变量引用,原数组里的元素还是原来的对象。要修改原数据,必须直接操作包含这个对象的数组,把原元素替换成拆分后的两个新对象。
完整解决方案
我们可以写一个递归函数,同时处理对象和数组的情况,确保所有层级的节点都被正确转换:
let data = { "filters": { "operator": "AND", "args": [ { "operator": "OR", "args": [ { "operator": "EQ", "name": "consumer_id", "args": [ "200" ], "type": "string" }, { "operator": "AND", "args": [ { "operator": "RANGE", "name": "created_date", "args": [ {"from":1},{"to":2} ], "type": "number" }, { "operator": "EQ", "name": "state", "args": [ "TN" ], "type": "string" } ] } ] }, { "operator": "GE", "name": "Character", "args": [ "H" ], "type": "string" } ] } }; function transformFilters(item) { // 处理数组:遍历数组元素,特别处理RANGE操作符 if (Array.isArray(item)) { let i = 0; while (i < item.length) { const current = item[i]; // 检测到RANGE操作符,拆分并替换 if (current.operator === "RANGE") { // 移除当前的RANGE元素 item.splice(i, 1); // 创建LE和GE两个新过滤器 const leFilter = { operator: "LE", column: current.name, args: [current.args[0].from], type: current.type }; const geFilter = { operator: "GE", column: current.name, args: [current.args[1].to], type: current.type }; // 将两个新过滤器插入到原位置 item.splice(i, 0, leFilter, geFilter); // 跳过刚插入的两个元素,继续遍历 i += 2; } else { // 非RANGE元素,递归处理其内部结构 transformFilters(current); i++; } } } // 处理对象:替换name为column,并递归处理子属性 else if (typeof item === "object" && item !== null) { // 替换name为column if (item.hasOwnProperty("name")) { item.column = item.name; delete item.name; } // 递归处理所有子属性 for (const key in item) { if (item.hasOwnProperty(key)) { transformFilters(item[key]); } } } } // 调用转换函数 transformFilters(data.filters); // 输出结果 console.log(JSON.stringify(data, null, 2));
代码解释
- 递归处理数组和对象:函数会自动识别传入的是数组还是对象,分别处理:
- 数组:遍历每个元素,遇到
RANGE就拆分成LE和GE,用splice直接修改原数组,确保原数据同步更新。 - 对象:检查是否有
name键,替换为column,然后递归处理对象的所有子属性。
- 数组:遍历每个元素,遇到
- 直接修改原数据:通过
splice操作数组,直接替换元素;通过修改对象属性的方式替换name,确保所有修改都同步到原始的data变量。
运行这段代码后,就能得到你想要的预期输出啦!
内容的提问来源于stack exchange,提问作者Vinoth Karthick
相关产品推荐
相关产品推荐

