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
相关产品推荐
相关产品推荐

