在 ImmutableJS 的 Map 中设置相同的值
Setting same value in Map in ImmutableJS
当我们设置原始值时,如果该值与现有值相同,则不会创建新的引用。
const Map = Immutable.Map;
const map1 = Map( {a: 1, b: 2, c: 3 })
const map2 = map1.set('b', 2)
console.log(map1.equals(map2)) // gives true
<script src="https://cdnjs.cloudflare.com/ajax/libs/immutable/3.8.1/immutable.js"></script>
但是,如果我们设置一个对象,它总是会创建一个新的引用
const Map = Immutable.Map;
const map1 = Map( {a: 1, b: {trial: 'value'}, c: 3 })
const map2 = map1.set('b', {trial: 'value'})
console.log(map1.equals(map2)) // gives false
<script src="https://cdnjs.cloudflare.com/ajax/libs/immutable/3.8.1/immutable.js"></script>
我怎样才能避免这种情况?如果值完全相同,则不应创建新引用。
Map
不会将值深度转换为不可变对象,例如您的代码存储两个不同的对象。但是,如果您使用 Map
或 fromJS
包装对象,则可以解决此问题。
const Map = Immutable.Map;
const map1 = Map( {a: 1, b: Map({trial: 'value'}), c: 3 })
const map2 = map1.set('b', Map({trial: 'value'}))
console.log(map1.equals(map2)) // gives false
<script src="https://cdnjs.cloudflare.com/ajax/libs/immutable/3.8.1/immutable.js"></script>
当我们设置原始值时,如果该值与现有值相同,则不会创建新的引用。
const Map = Immutable.Map;
const map1 = Map( {a: 1, b: 2, c: 3 })
const map2 = map1.set('b', 2)
console.log(map1.equals(map2)) // gives true
<script src="https://cdnjs.cloudflare.com/ajax/libs/immutable/3.8.1/immutable.js"></script>
但是,如果我们设置一个对象,它总是会创建一个新的引用
const Map = Immutable.Map;
const map1 = Map( {a: 1, b: {trial: 'value'}, c: 3 })
const map2 = map1.set('b', {trial: 'value'})
console.log(map1.equals(map2)) // gives false
<script src="https://cdnjs.cloudflare.com/ajax/libs/immutable/3.8.1/immutable.js"></script>
我怎样才能避免这种情况?如果值完全相同,则不应创建新引用。
Map
不会将值深度转换为不可变对象,例如您的代码存储两个不同的对象。但是,如果您使用 Map
或 fromJS
包装对象,则可以解决此问题。
const Map = Immutable.Map;
const map1 = Map( {a: 1, b: Map({trial: 'value'}), c: 3 })
const map2 = map1.set('b', Map({trial: 'value'}))
console.log(map1.equals(map2)) // gives false
<script src="https://cdnjs.cloudflare.com/ajax/libs/immutable/3.8.1/immutable.js"></script>