如何用JavaScript遍历嵌套对象并为p1、p2内部值应用自定义加密函数?
解决嵌套对象p1/p2属性加密的正确实现
首先要明确核心需求:生成全新的加密对象(不修改原始数据),仅对p1和p2下的所有属性值应用加密函数,其他属性保留原样。以下分两种场景给出实现方案:
场景1:p1/p2为单层对象(无深层嵌套)
如果p1和p2都是单层键值对,无需递归,直接遍历属性即可:
// 假设你的加密函数已实现 function encryption(value) { // 示例:以反转字符串模拟加密逻辑 return value.split('').reverse().join(''); } // 原始credentials对象结构示例 const credentials = { userId: "u_001", p1: { username: "charlie", password: "charlie_789" }, p2: { apiKey: "key_abc123", secret: "sec_xyz456" }, remark: "无需加密" }; // 生成加密后的新对象 const encryptedCredentials = { ...credentials, // 复制不需要加密的顶层属性 p1: Object.fromEntries( Object.entries(credentials.p1).map(([key, val]) => [key, encryption(val)]) ), p2: Object.fromEntries( Object.entries(credentials.p2).map(([key, val]) => [key, encryption(val)]) ) };
场景2:p1/p2包含深层嵌套对象
如果p1或p2内部还有多层子对象,需要用递归遍历所有层级的属性值:
function encryption(value) { return value.split('').reverse().join(''); } // 递归处理嵌套对象的加密逻辑 function encryptNestedObject(obj) { // 非对象类型直接加密(注意处理null,typeof null === 'object') if (typeof obj !== 'object' || obj === null) { return encryption(obj); } // 数组类型递归处理每个元素 if (Array.isArray(obj)) { return obj.map(item => encryptNestedObject(item)); } // 对象类型递归处理每个属性 return Object.fromEntries( Object.entries(obj).map(([key, val]) => [key, encryptNestedObject(val)]) ); } // 含深层嵌套的原始对象示例 const credentials = { userId: "u_002", p1: { userInfo: { name: "david", email: "david@test.com" }, loginPwd: "david_1234" }, p2: { auth: { token: "token_789", expireTime: "2026-06-01" } } }; const encryptedCredentials = { ...credentials, p1: encryptNestedObject(credentials.p1), p2: encryptNestedObject(credentials.p2) };
常见错误排查
- 直接修改原对象:如果你的代码直接操作
credentials.p1的属性,会污染原始数据,必须通过解构、Object.fromEntries等方式生成新对象。 - 未处理深层嵌套:单层遍历只能处理
p1/p2的顶层属性,深层子对象的属性不会被加密,此时必须用递归遍历。 - 忽略非字符串类型:如果属性值是数字、布尔值等,要确保加密函数能兼容处理,或在递归逻辑中增加类型判断后再执行加密。
内容的提问来源于stack exchange,提问作者Zayn Sheikh
相关产品推荐
相关产品推荐

