uni-app getStorageSync获取数组数据会变成{"type":"object":"data":[]}的对象 而不是直接一个数组

发布于 1周前 作者 yuanlaile 来自 Uni-App

uni-app getStorageSync获取数组数据会变成{“type”:“object”:“data”:[]}的对象 而不是直接一个数组

示例代码:

let location_list = uni.getStorageSync("location_list") || [];  

操作步骤:

  • 获取类型为数组缓存的时候有时候会出现

预期结果:

  • 应该是直接一个数组数据 []

实际结果:

  • 对象 {"type":"object","data":[]}

bug描述:

使用getStorageSync获取的数组数据变成了对象 {"type":"object","data":[]}

这样导致了我程序出错了,本意是获取数组,但是实际上获取的一个对象,他并不是会稳定出现,部分手机会出现

Image

信息类别 详细信息
产品分类 uniapp/App
PC开发环境 Windows
PC开发环境版本号 windows10
HBuilderX类型 正式
HBuilderX版本号 3.99
手机系统 Android
手机系统版本号 Android 7.0
手机厂商 商米
手机机型 L2K
页面类型 vue
vue版本 vue2
打包方式 云端
项目创建方式 HBuilderX

6 回复

hbx 3.99 换了四个手机,一共测了20次,没发现你说的情况 你可以写死个简单的数组自己试试


我有个JSON数据,百分百复现此问题,如何给你呢?

我处理的方式基本上都是先存 json字符串,然后取出来在解析

很早之前遇到过,对数据做个判断,Array.isArray(data) 是数组,Object.prototype.toString.call(data) == ‘[object Object]’ 是对象,分开处理

我们也遇到了,有个用户有这个问题。华为手机,但是苹果手机没这个问题。确实很奇怪。

uni-app 中使用 uni.getStorageSync 获取存储的数据时,如果存储的是一个数组,但获取到的结果却是一个形如 {"type":"object","data":[]} 的对象,这通常是因为你在存储数据时,将数组转换成了这种格式。

问题原因

这种情况通常发生在你使用了某种序列化或封装方法,将数组转换成了包含 typedata 字段的对象。例如:

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]
}
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!