immutablejs 是不是允许使用引用类型进行搜索

Posted

技术标签:

【中文标题】immutablejs 是不是允许使用引用类型进行搜索【英文标题】:Does immutablejs allow searching with a reference typeimmutablejs 是否允许使用引用类型进行搜索 【发布时间】:2022-01-14 08:37:31 【问题描述】:

我有一段看起来像这样的代码

const  Map  = require('immutable@4.0.0')

let map = new Map().setIn(["user",["alex","country"]],"Poland")
map.getIn(["user",["alex","country"])

我希望上面会返回"Poland",但事实并非如此。我相信 设置和查询时引用类型["alex", "country"] 的序列化方式不同。关于如何实现这一目标的任何帮助都会有所帮助。我避免手动处理数组序列化

【问题讨论】:

这是您的实际代码吗? map.getIn(["user",["alex","country"]) 包含一个错字。 【参考方案1】:

数组未序列化。 immutable 使用实际对象(其引用)作为键,使用等号运算符来比较键。这意味着第一个 ["alex","country"] 和第二个 ["alex","country"] 是两个不同的键。

这个sn-p显示了问题:

if (['alex', 'country'] !== ['alex', 'country']) 
  console.log('The references are different');

我有 3 个解决方案:

1.将引用存储在变量中

您可以将数组的引用存储在变量中以将其用作键:

const  Map  = require('immutable');

const arr = ['alex', 'country'];
let map = new Map().setIn(['user', arr], 'Poland');
console.log(map.getIn(['user', arr]));

2。使用toString序列化数组

另一种解决方案是使用toString 序列化数组:

const  Map  = require('immutable@4.0.0')

let map = new Map().setIn(["user",["alex","country"].toString()],"Poland")
map.getIn(["user",["alex","country"].toString()])

示例 sn-p:

if (['alex', 'country'].toString() === ['alex', 'country'].toString()) 
  console.log('The serialized arrays are equal');

但请记住,序列化不同的数组可以产生相同的字符串:

if (['alex', 'country'].toString() === ['alex,country'].toString()) 
  console.log('Serializing different arrays can yield the same string');

3.展平数组

另一种方法是将路径数组展平:

const  Map  = require('immutable');

let map = new Map().setIn(['user', ['alex', 'country']].flat(), 'Poland');
console.log(map.getIn(['user', ['alex', 'country']].flat()));

【讨论】:

如果 const arr = ['alex', 'country'] 总是在相同的上下文中组合和引用,那将起作用 @Ndifreke 在这种情况下,您不能使用非基元作为键。 immutable 不序列化对象。 展平数组正是我所需要的,谢谢

以上是关于immutablejs 是不是允许使用引用类型进行搜索的主要内容,如果未能解决你的问题,请参考以下文章

WCF服务编程一书中写到:契约操作不能使用引用对象参数,只允许使用基本类型或者数据契约?

引用的 MIME 媒体类型参数是不是允许转义引号?

如何正确传递 immutablejs 对象

redux的笔记

Redux + ImmutableJS - 如何垃圾收集太大的存储?

Java 虚拟机是不是允许重载返回类型?