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

Node.js中处理对象字面量:替换键名及拆分RANGE操作符的实现问题

解决JSON过滤器转换的问题

首先,你的代码有两个关键问题需要修正:一是替换name为column的方式不对,二是处理RANGE操作符时没有更新原数组的元素。我来一步步帮你解决:

问题分析

  1. name转column无效:你只是修改了循环中的prop变量名,但这并不会改变对象的实际属性键。你需要直接操作对象,把name的值赋给column,然后删除原name键。
  2. 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));

代码解释

  1. 递归处理数组和对象:函数会自动识别传入的是数组还是对象,分别处理:
    • 数组:遍历每个元素,遇到RANGE就拆分成LE和GE,用splice直接修改原数组,确保原数据同步更新。
    • 对象:检查是否有name键,替换为column,然后递归处理对象的所有子属性。
  2. 直接修改原数据:通过splice操作数组,直接替换元素;通过修改对象属性的方式替换name,确保所有修改都同步到原始的data变量。

运行这段代码后,就能得到你想要的预期输出啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 20:17:49