如何从嵌套Immutable Map对象中获取深层nodes数组的值
嵌套Immutable Map数据访问方案
问题复现
尝试从Immutable Map结构中提取数据时,执行以下代码返回长度为0的空数组:
console.log(props.mapValues.get('entries'))
打印的Map精简结构如下:
size: 4 __altered: false __hash: undefined __ID: undefined _root: ArrayMapNode entries: Array(1) 0: Array(2) 0:"default" 1: Map size:10 __altered: false --hash:undefined _root:BitmapIndexedNode bitmap: nodes: Array(4) 0: Value{} 1:Value{} 2:Value{} 3:BitmapIndexNode{} [[Prototype]]Array(0)
对应控制台结构截图:
核心原因
你看到的_root、entries、__altered、nodes全是Immutable.js的内部私有实现属性,不是业务代码调用set()存入的对外可访问键,直接调用get('entries')自然拿不到目标值。
这些内部属性是Immutable用来优化存储性能的,数据量变化时存储结构会自动切换(少量数据用ArrayMapNode,数据量上来自动转BitmapIndexedNode/HashMapNode),直接访问下划线开头的内部属性写的代码,在Immutable版本升级或者数据量变化时会直接失效。
正确访问方法
严格使用Immutable官方提供的API逐层取值,不要触碰内部私有属性:
- 从结构可以看到最外层Map存储的第一个键是
"default",对应的值是一个嵌套的子Map,首先取出这个子Map - 你看到的
nodes数组是子Map存储业务值的内部节点,要拿子Map里存的所有业务值,直接调用官方的取值方法转成数组即可,不需要硬扒内部nodes
// 取出key为default对应的子Map const defaultSubMap = props.mapValues.get('default') // 获取子Map中存储的所有业务值,转成普通数组,对应你看到nodes里的4个Value对象 const targetValues = defaultSubMap.valueSeq().toArray() console.log(targetValues) // 如果要取子Map里指定key的值,直接传入业务key调用get即可 // const specificValue = defaultSubMap.get('你的业务键名')
禁止写类似
props.mapValues._root.entries[0][1]._root.nodes的代码,这种写法完全依赖Immutable的内部实现,没有任何兼容性保障,随时会报错。
内容的提问来源于stack exchange,提问作者Colorful Codes
相关产品推荐
相关产品推荐

