【问题标题】: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"]) 包含一个错字。

标签: javascript immutable.js


【解决方案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 不序列化对象。
  • 展平数组正是我所需要的,谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-31
  • 2019-01-10
  • 1970-01-01
  • 2018-10-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多