immutable.js
中,Map
对象有个 merge
和 mergeDeep
方法
merge
参数可以是immutable对象
或者js对象
,如果是js对象
,参数只是被浅层的转换成 immutable
数据,深层的对象还是 js
对象.
const map = new Map({ key1: 'value' });
const a = { key2: { x: 1 } };
const b = map.merge(a);
如上的例子,b.get('key2')
得到的是一个JS对象
。直接用 .x
获得值1
(而不是.get('x')
)
mergeWith
const one = Map({ a: 10, b: 20, c: 30 })
const two = Map({ b: 40, a: 50, d: 60 })
one.mergeWith((oldVal, newVal) => oldVal / newVal, two)
// { "a": 0.2, "b": 0.5, "c": 30, "d": 60 }
two.mergeWith((oldVal, newVal) => oldVal / newVal, one)
// { "b": 2, "a": 5, "d": 60, "c": 30 }
mergeWith
比 merge
多了一个参数,需要传入一个函数,当要合并的对象有相同的属性时,会调用这个函数,并且把两个有冲突的属性当做参数传入函数。
mergeDeep
const { Map } = require('immutable')
const one = Map({ a: Map({ x: 10, y: 10 }), b: Map({ x: 20, y: 50 }) })
const two = Map({ a: Map({ x: 2 }), b: Map({ y: 5 }), c: Map({ z: 3 }) })
one.mergeDeep(two)
// Map {
// "a": Map { "x": 2, "y": 10 },
// "b": Map { "x": 20, "y": 5 },
// "c": Map { "z": 3 }
// }
mergeDeep
和 merge
类似,但是当两个对象有相同的属性时,merge
只是简单的浅替换,而 mergeDeep
是深层的替换(会遍历嵌套的属性)
mergeDeepWith
const { Map } = require('immutable')
const one = Map({ a: Map({ x: 10, y: 10 }), b: Map({ x: 20, y: 50 }) })
const two = Map({ a: Map({ x: 2 }), b: Map({ y: 5 }), c: Map({ z: 3 }) })
one.mergeDeepWith((oldVal, newVal) => oldVal / newVal, two)
// Map {
// "a": Map { "x": 5, "y": 10 },
// "b": Map { "x": 20, "y": 10 },
// "c": Map { "z": 3 }
// }
与 mergeWith
类似。
网友评论