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

TypeScript中按指定键值删除JSON对象及空父对象的代码问题

问题描述

给定JSON数据:

{"fgdsgd":"11111","dsadsadsa":["ip","userAaaagent"],"fdsfsd":{"sadsdsaasd":false,"dates":null},"pxg":{"aaa":[{"active":1,"bbbb":"12"},{"active":1,"bbb":"123"}]}}

需要在TypeScript中实现以下逻辑:

  • 查找**键为xzxzxz且值为"12"**的对象,将其从所在数组中移除;
  • 移除后若该数组为空,则删除其所属的pxg父对象。

示例结果:

  • 移除后数组非空时:
{"fgdsgd":"11111","dsadsadsa":["aaa","ccc"],"fdsfsd":{"sadsdsaasd":false,"dates":null},"pxgxzxz":{"sdsds":[{"active":1,"xzxzx":"123"}]}}
  • 移除后数组为空时:
{"fgdsgd":"11111","dsadsadsa":["ccc","cccc"],"fdsfsd":{"sadsdsaasd":false,"dates":null}}

用户编写的TypeScript代码运行报错,代码如下:

const data = {"fgdsgd": "11111","dsadsadsa": ["ip", "userAgent"],"fdsfsd": {"sadsdsaasd": false,"dates": null},"vvvvv": {"trackivvvvngIds": [{"active": 1,"cccc": "12"},{"active": 1,"ccc": "123"}]}};
interface Tracxzxzkingxz {
active: number;
zxzxz: string;
}
interface vvvv{
trackinvvvgIds: ccccc[];
}
interface pixels {
fgdsgd: string;
dsadsadsa: string[];
fdsfsd: {sadsdsaasd: boolean;dates: null;};
zxzxzx?: PxgOxzxbject;
}
const xzxz= "12";
// Find the index of the object with the given pixzxzxzelId
const index: any = pixels.pxg.trackinxzxzgIds.findIndex((obj: xzxzxz) => obj.xzxz=== xzxzxz);
if (index !== -1) {
  // Remove the object at the found index
  data.pxg.zxxz.splice(index, 1);
  // Remove the pxg object if the trackinxzxzgIds array is empty
  if (data.pxg.trackxzxzingIds.length === 0) {
    delete data.pxg;
  }
}
console.log(data);
错误排查
  • 接口定义混乱且未关联实际数据:
    • 自定义接口命名混乱(如Tracxzxzkingxz),cccccc[]类型未定义,pixels接口中引用的PxgOxzxbject不存在;
  • 混淆类型与数据对象:
    • 错误地直接操作接口pixels的属性,应该操作实际数据变量data;
  • 属性名完全不匹配:
    • 原数据父对象是vvvvv而非pxg,数组属性是trackivvvvngIds而非trackinxzxzgIds,查找键xzxz与数据中的cccc不匹配,还存在多处拼写错误(如zxxz);
  • 类型标注错误:
    • findIndex回调中用变量xzxzxz作为类型,而非正确的接口类型。
修正后的实现代码
// 定义适配数据结构的类型
interface Item {
  active: number;
  [key: string]: any; // 支持动态键名查找
}

interface PxgObject {
  [key: string]: Item[]; // pxg下的属性均为Item数组
}

interface Data {
  fgdsgd: string;
  dsadsadsa: string[];
  fdsfsd: {
    sadsdsaasd: boolean;
    dates: null;
  };
  pxg?: PxgObject; // 可选属性,因为可能被删除
}

// 匹配需求的原始数据
const data: Data = {
  "fgdsgd": "11111",
  "dsadsadsa": ["ip", "userAaaagent"],
  "fdsfsd": {"sadsdsaasd": false,"dates": null},
  "pxg": {"aaa": [{"active": 1,"xzxzxz": "12"},{"active": 1,"bbb": "123"}]}
};

const targetKey = "xzxzxz";
const targetValue = "12";

// 检查pxg对象是否存在
if (data.pxg) {
  // 遍历pxg下的所有数组属性
  for (const [arrayKey, items] of Object.entries(data.pxg)) {
    // 查找符合键值条件的对象索引
    const targetIndex = items.findIndex(item => item[targetKey] === targetValue);
    
    if (targetIndex !== -1) {
      // 移除目标对象
      items.splice(targetIndex, 1);
      
      // 数组为空则删除该数组属性
      if (items.length === 0) {
        delete data.pxg![arrayKey];
        
        // pxg为空对象则删除pxg本身
        if (Object.keys(data.pxg!).length === 0) {
          delete data.pxg;
        }
      }
      
      // 找到目标后停止遍历(需处理多个匹配项可移除break)
      break;
    }
  }
}

console.log(JSON.stringify(data, null, 2));
代码说明
  • 类型设计:用索引签名实现动态键名的适配,避免硬编码属性名;
  • 逻辑流程:先确认pxg存在,再遍历其下的数组,找到目标对象后移除,依次检查数组和pxg是否为空并做对应删除;
  • 鲁棒性:处理了pxg不存在、数组为空等边界情况,用非空断言保证类型安全。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 19:53:21