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

Does immutablejs allow searching with a reference type

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

const { Map } = require('immutable@4.0.0')

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

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

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

此代码段显示了问题:

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()])

示例片段:

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()));