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服务编程一书中写到:契约操作不能使用引用对象参数,只允许使用基本类型或者数据契约?