如何在JavaScript中移除对象中的未知额外属性
移除对象中未知额外属性的实现方案
当然可以实现,核心思路是基于已知的属性结构,递归遍历对象,只保留指定层级的所需属性,完全能解决嵌套对象里混有未知属性的问题。
实现步骤
- 定义「所需属性的结构」:不是简单的属性名数组,而是和目标对象层级对应的嵌套结构,明确每个层级需要保留的属性。比如你的例子里,所需结构应该是:
const requiredSchema = { name: true, age: true, Address: { City: true } };
- 写递归清理函数:遍历对象的每个属性,判断当前属性是否在
requiredSchema中存在。如果是嵌套对象,就递归调用清理函数处理子对象;如果是普通属性且在schema中,就保留,否则直接过滤。
完整代码示例
function cleanObject(obj, schema) { // 处理非对象的情况(比如原始值、null) if (typeof obj !== 'object' || obj === null) { return obj; } // 处理数组(如果需要清理数组中的对象) if (Array.isArray(obj)) { return obj.map(item => cleanObject(item, schema)); } const cleaned = {}; // 遍历schema中的属性,只保留这些属性 Object.keys(schema).forEach(key => { if (obj.hasOwnProperty(key)) { const value = obj[key]; // 如果schema中当前属性是对象,递归清理子对象 if (typeof schema[key] === 'object' && schema[key] !== null) { cleaned[key] = cleanObject(value, schema[key]); } else { cleaned[key] = value; } } }); return cleaned; } // 原始对象 const originalObj = { name: "Harry", age: 16, gender: "Male", Address: { prop1: "Hello", City: "LA" } }; // 清理后结果 const cleanedObj = cleanObject(originalObj, requiredSchema); console.log(cleanedObj);
输出结果
{ name: "Harry", age: 16, Address: { City: "LA" } }
补充说明
- 方案支持任意层级的嵌套对象,不管额外属性出现在哪一层,都会被过滤掉。
- 如果场景里包含数组(比如数组元素是需要清理的对象),函数里的数组处理逻辑已经覆盖了这种情况。
- 用
hasOwnProperty是为了确保只处理对象自身的属性,避免继承来的属性被误处理。
内容的提问来源于stack exchange,提问作者Atul Kumar
相关产品推荐
相关产品推荐

