JavaScript解密函数异常:API对象数组解密返回结果不符预期
修复你的递归解密函数问题
我一眼就发现了两个核心问题,正是它们导致你的函数没法正确处理对象数组:
1. 判断顺序错误,数组被误当成普通对象处理
在JavaScript里,typeof []的返回值是"object",所以你的第一个if分支会优先匹配数组,导致数组永远走不到专门的数组处理逻辑里。这就是为什么你最终得到的是对象而非数组——数组被当作普通对象遍历索引键,最后返回的是一个以索引为键的对象,完全不是你想要的数组结构。
2. 数组处理逻辑本身有误
就算数组分支能被触发,你用for(var $i of $value)拿到的是数组里的元素值,不是索引,然后执行$result[$i] = ...,这会把元素值当作数组下标来赋值,逻辑完全混乱,最后自然只能得到错误的结果。
修复后的完整代码
sharedServices.encryption.decrypt = function($value) { // 先判断数组,避免被普通对象的判断分支拦截 if(Array.isArray($value)) { const $result = []; // 遍历数组元素,用push保证数组结构正确 for(const item of $value) { $result.push(sharedServices.encryption.decrypt(item)); } return $result; } else if(typeof $value === "object" && $value !== null) { const $result = {}; for(const $key in $value) { // 加上hasOwnProperty,避免遍历原型链上的继承属性 if($value.hasOwnProperty($key)) { $result[$key] = sharedServices.encryption.decrypt($value[$key]); } } return $result; } else { const $pepperSalt = sharedServices.encryption.pepper + "3" + sharedServices.encryption.salt; const encryption = new Encryption(); return encryption.decrypt($value, $pepperSalt); } };
关键修复点说明
- 调整判断顺序:先检查
Array.isArray($value),确保数组能进入专属的处理分支,不会被普通对象的判断逻辑拦截。 - 修复数组遍历逻辑:用
for...of遍历数组元素,通过push()把解密后的元素添加到结果数组,保证数组结构完全正确。 - 添加
hasOwnProperty校验:避免遍历对象原型链上的继承属性,让解密逻辑更安全严谨。 - 替换变量声明方式:用
const替代无声明(会造成全局变量污染)和var,提升代码的块级作用域安全性。
修改后,函数就能正确递归解密对象数组,返回结构完全匹配的数组结果了。
内容的提问来源于stack exchange,提问作者Luke Pring
相关产品推荐
相关产品推荐

