TypeScript中如何提取对象中指定键名的所有值(含嵌套对象)
提取未知嵌套对象中所有'speed'字段的值(TypeScript实现)
你可以通过递归遍历对象的方式来实现,相比JSON.stringify解析,这种方法更高效、灵活,能直接操作原始值,还能处理任意深度的嵌套结构。
核心实现代码
function extractSpeedValues(obj: unknown): (string | number)[] | null { const result: (string | number)[] = []; const traverse = (item: unknown) => { // 跳过null、undefined和非对象/数组类型 if (item == null || typeof item !== 'object') return; // 兼容数组场景(可选,若你的数据不会出现数组可移除) if (Array.isArray(item)) { item.forEach(traverse); return; } // 遍历对象的每个键值对 for (const [key, value] of Object.entries(item as Record<string, unknown>)) { // 匹配'speed'键,尝试转换为数字(匹配你的期望输出) if (key === 'speed') { const numVal = Number(value); result.push(isNaN(numVal) ? (value as string) : numVal); } // 递归遍历嵌套对象 traverse(value); } }; traverse(obj); return result.length > 0 ? result : null; }
测试示例对象
const MyObject = { AnEntry: {"speed":"5", "somthingElse":6}, AnotherEntry: {"somethingElse":"3"}, YetAnother:true, AndMore:{"speed":"eleven"}, Finally:{"more":7,nested:{"notHere":7, "speed":"5"}} }; console.log(extractSpeedValues(MyObject)); // 输出: [5, "eleven", 5]
关键说明
- 递归遍历逻辑:无论对象嵌套多少层,都会逐层遍历所有属性,不会遗漏深层的
speed字段。 - 类型处理:针对
unknown类型的输入做了安全判断,避免运行时错误;同时按照你的期望,将可转换为数字的speed值转为数字,无法转换的保留原始字符串。 - 性能优势:相比
JSON.stringify序列化后再解析的方式,递归遍历不需要额外的序列化/反序列化开销,处理大对象时效率更高。 - 边界情况:如果输入中没有任何
speed字段,函数会返回null;如果输入是数组或非对象类型,也能正确处理。
内容的提问来源于stack exchange,提问作者user20352211
相关产品推荐
相关产品推荐

