收藏
回答

微信小程序无法保存对象中的对象的属性到本地缓存

问题模块 框架类型 问题类型 API/组件名称 终端类型 微信版本 基础库版本
API和组件 小程序 需求 wx.setStorageSync 客户端 7.0.3 2.5.2

- 需求的场景描述(希望解决的问题)




第二张图是最后一行代码所打印出的结果,group是bills数组里的对象的属性,也是一个对象。已经使用api存入缓存了对吧,从控制台打印的结果可以知道group是有属性的,但是,重载app之后,控制台打印的结果中group没有属性了。

如图,我在拿到缓存后就立马打印了,这个时候group就已经没有属性了。

所以我判断是在调用api的时候,导致这个对象里的对象的属性没有存入缓存,具体是什么原因我也不明白,如果有懂的朋友,希望帮我解答下。


- 希望提供的能力

因为我在控制台尝试过,用JSON.stringfy是完全可行的,但是为什么这里不行?所以这个地方是什么原因,希望能给我解答一下,谢谢。

我也会继续寻找可能的原因。

最后一次编辑于  02-20  (未经腾讯允许,不得转载)
邀请回答
复制链接收藏投诉关注问题回答

1 个回答

  • Ekk
    Ekk
    02-20

    好吧,我刚刚写完问题,就找到原因了。。。

    是这样的,因为我需要的属性名是一个变量的原因,我不得不使用defineProperty来给对象定义属性,这样就可以直接把变量的值作为属性而不是变量名被当做属性。但是似乎对对象里的对象属性使用Object.defineProperty的时候,需要强调一下enumerable为true,如果不强调光写value的话,似乎默认会给一个false,因此就导致JSON.stringfy排除了这个属性,那么你存到缓存的时候就根本没存这个属性进去,自然你重载app之后就看不到这个属性了。

    为什么会想到这里呢?因为我看控制台忽然发现这个属性是浅色的,我就在想会不会是这个原因,然后又联想到我用defineProperty方法的时候只写了value,其他enumerable,writable这些属性都没有配置,说不定就是这里的原因,结果一试还真是这样!

    这个解答留给日后碰到和我一样问题的小伙伴。

    02-20
    赞同
    回复 1
    • Ekk
      Ekk
      02-20

      而且这个情况仅限于对象被对象包裹的情况,如果是数组包裹的对象都不会发生这个问题。

      [{a: }]对a用defineProperty默认的enumerable √   {a:{b: }}对b用defineProperty默认的enumerable ×

      估计是标准中规定过的,然而我只看网上文档的人并不知道。。。

      02-20
      回复