uni-app getStorageSync获取数组数据会变成{"type":"object":"data":[]}的对象 而不是直接一个数组
uni-app getStorageSync获取数组数据会变成{“type”:“object”:“data”:[]}的对象 而不是直接一个数组
示例代码:
let location_list = uni.getStorageSync("location_list") || [];
操作步骤:
- 获取类型为数组缓存的时候有时候会出现
预期结果:
- 应该是直接一个数组数据 []
实际结果:
- 对象
{"type":"object","data":[]}
bug描述:
使用getStorageSync获取的数组数据变成了对象 {"type":"object","data":[]}
这样导致了我程序出错了,本意是获取数组,但是实际上获取的一个对象,他并不是会稳定出现,部分手机会出现
信息类别 | 详细信息 |
---|---|
产品分类 | uniapp/App |
PC开发环境 | Windows |
PC开发环境版本号 | windows10 |
HBuilderX类型 | 正式 |
HBuilderX版本号 | 3.99 |
手机系统 | Android |
手机系统版本号 | Android 7.0 |
手机厂商 | 商米 |
手机机型 | L2K |
页面类型 | vue |
vue版本 | vue2 |
打包方式 | 云端 |
项目创建方式 | HBuilderX |
hbx 3.99 换了四个手机,一共测了20次,没发现你说的情况
你可以写死个简单的数组自己试试
我有个JSON数据,百分百复现此问题,如何给你呢?
我处理的方式基本上都是先存 json字符串,然后取出来在解析
很早之前遇到过,对数据做个判断,Array.isArray(data) 是数组,Object.prototype.toString.call(data) == ‘[object Object]’ 是对象,分开处理
我们也遇到了,有个用户有这个问题。华为手机,但是苹果手机没这个问题。确实很奇怪。
在 uni-app
中使用 uni.getStorageSync
获取存储的数据时,如果存储的是一个数组,但获取到的结果却是一个形如 {"type":"object","data":[]}
的对象,这通常是因为你在存储数据时,将数组转换成了这种格式。
问题原因
这种情况通常发生在你使用了某种序列化或封装方法,将数组转换成了包含 type
和 data
字段的对象。例如:
const myArray = [1, 2, 3];
const storageData = { type: 'object', data: myArray };
uni.setStorageSync('myKey', storageData);
这样存储后,当你使用 uni.getStorageSync
获取数据时,得到的就是这个封装后的对象,而不是直接的数组。
解决方法
要解决这个问题,你需要在存储数据时直接存储数组,而不是将其封装成对象。例如:
const myArray = [1, 2, 3];
uni.setStorageSync('myKey', myArray);
然后,当你使用 uni.getStorageSync
获取数据时,就会直接得到数组:
const storedArray = uni.getStorageSync('myKey');
console.log(storedArray); // 输出: [1, 2, 3]
如果已经存储了封装对象怎么办?
如果你已经存储了封装对象,但仍然想要获取数组,可以在获取数据后手动提取 data
字段:
const storedData = uni.getStorageSync('myKey');
if (storedData && storedData.type === 'object') {
const myArray = storedData.data;
console.log(myArray); // 输出: [1, 2, 3]
}