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

如何改写TypeScript扁平化嵌套对象函数以消除TS错误并移除父键前缀

解决方案:扁平化嵌套对象(无父键前缀+消除TS错误)

直接上适配需求的最终代码:

type FlattenedObject = Record<string, unknown>;

const flattenObj = (obj: Record<string, unknown>): FlattenedObject => {
  const result: FlattenedObject = {};

  for (const key in obj) {
    // 过滤原型链属性,解决TS的for...in检查错误
    if (obj.hasOwnProperty(key)) {
      const value = obj[key];
      // 仅处理非数组、非null的对象类型
      if (typeof value === 'object' && value !== null && !Array.isArray(value)) {
        // 递归扁平化嵌套对象,直接合并键值对到结果,不添加父键前缀
        const nestedFlattened = flattenObj(value as Record<string, unknown>);
        Object.assign(result, nestedFlattened);
      } else {
        // 非嵌套属性直接存入结果
        result[key] = value;
      }
    }
  }

  return result;
};

// 测试你的示例数据
const input = {
  "status": 1, 
  "data" : {
       "name": "Tank",
       "dimensions": "2.0 x 2.5 x 4.0"
  }
};

console.log(flattenObj(input));
// 输出:{ status: 1, name: 'Tank', dimensions: '2.0 x 2.5 x 4.0' }

关键修改说明:

  • 解决TS错误:在for...in循环里加obj.hasOwnProperty(key)判断,确保只遍历对象自身的属性,排除原型链上的继承属性,符合TS的严格检查规则。
  • 去掉父键前缀:放弃原代码中拼接父键的逻辑,改用Object.assign直接把嵌套对象扁平化后的键值对合并到结果中,直接保留嵌套字段的原键名。
  • 边界处理:增加value !== null判断,避免把null误判为对象导致递归错误;同时排除数组类型,防止把数组也拆解。
  • 类型安全:添加TS类型定义,明确函数的输入输出类型,避免隐式类型转换的潜在问题。

注意点:

如果嵌套层级中出现同名键,后处理的键会覆盖先处理的(比如外层和data里都有status,最终结果会取data中的值)。如果需要处理这种冲突,可以根据业务需求调整逻辑(比如保留外层值、添加区分前缀等)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 16:33:22