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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 06:36:11