Immutable API 简介
Immutable的数据类型
- List: 有序索引集,类似JavaScript中的Array。
- Map: 无序索引集,类似JavaScript中的Object。
- OrderedMap: 有序的Map,根据数据的set()进行排序。
- Set: 没有重复值的集合。
- OrderedSet: 有序的Set,根据数据的add进行排序。
- Stack: 有序集合,支持使用unshift()和shift()添加和删除。
- Range(): 返回一个Seq.Indexed类型的集合,这个方法有三个参数,start表示开始值,默认值为0,end表示结束值,默认为无穷大,step代表每次增大的数值,默认为1.如果start = end,则返回空集合。
- Repeat(): 返回一个vSeq.Indexe类型的集合,这个方法有两个参数,value代表需要重复的值,times代表要重复的次数,默认为无穷大。
- Record: 一个用于生成Record实例的类。类似于JavaScript的Object,但是只接收特定字符串为key,具有默认值。
- Seq: 序列,但是可能不能由具体的数据结构支持。
- Collection: 是构建所有数据结构的基类,不可以直接构建。
API
fromJS()
作用:将一个js数据转换为Immutable类型的数据。用法:fromJS(value, converter)
简介:value是要转变的数据,converter是要做的操作。第二个参数可不填,默认情况会将数组准换为List类型,将对象转换为Map类型,其余不做操作。
代码实现:
“`javascript
const obj = Immutable.fromJS({a:’123’,b:’234’},function (key, value, path) {
console.log(key, value, path)
return isIndexed(value) ? value.toList() : value.toOrderedMap())
})toJS()
作用:将一个Immutable数据转换为JS类型的数据。用法:value.toJS()
List(Array)
List.isList(value) 判断是否是一个List类型
注意:若下标为-1,则从最后一位开始const oList = Immutable.List([0, 1, 2]); const addFormLast = oList.set(-1, -1); // set(下标, value) console.log(addFormLast.toJS()); // [0, 1, -1] const deleteList1 = oList.delete(0); console.log(deleteList1.toJS()); // [1, 2] const deleteList2 = oList.delete(-1); console.log(deleteList2.toJS()); // [0, 1]
List没有明显的’unset’(未被设置值)或者’undefined’(值设置为undefined)数据的概念。在List#forEach中可以体现
// unset & undefined const originList = [1, 2, , 4]; const collectionList = Immutable.List(originList); collectionList.forEach(function(v, i) { console.log(`${i} ${v}`); // 0 1 // 1 2 // 2 undefined // 3 4 }); originList.forEach(function(v, i) { console.log(`${i} ${v}`); // 0 1 // 1 2 // 3 4 });
Map(obj)
Map.isMap(value) 判断是否是一个Map类型
const anyKeyMap = Immutable.Map(); console.log(anyKeyMap.set(key1, 'hello1').get(key1)); // hello1 console.log(anyKeyMap.set(key2, 'hello2').get(key2)); // hello2 console.log(anyKeyMap.set(key3, 'hello3').get(key3)); // hello3 console.log(anyKeyMap.set(key4, 'hello4').get(key4)); // hello4 console.log(anyKeyMap.set(key5, 'hello5').get(key5)); // hello5 let key = NaN; const initMap = Immutable.Map({ key: 'hello' }); console.log(initMap.get(key)); // undefined console.log(initMap.get('key')); // hello console.log(anyKeyMap.set(key, 'hello5').get(key)); // hello5 key为变量
如果需要在初始化
Map
的时候传入初始值,那么key
值必须为string
类型,否则取到的值是undefined
。is()
作用:对两个对象进行比较。用法:is(map1,map2)
简介:和js中对象的比较不同,在js中比较两个对象比较的是地址,但是在Immutable中比较的是这个对象hashCode和valueOf,只要两个对象的hashCode相等,值就是相同的,避免了深度遍历,提高了性能。
代码实现:
import { Map, is } from 'immutable'
const map1 = Map({ a: 1, b: 1, c: 1 })
const map2 = Map({ a: 1, b: 1, c: 1 })
map1 === map2 //false
Object.is(map1, map2) // false
is(map1, map2) // true
console.log(Immutable.is(NaN, NaN)); // true
is()中的值也可以是JS类型,但是只要值有至少一个是JS类型时,就会按照JS的规则(值,地址)进行比较,只有当均为Immutable类型时,才会只比较值。
注意:NaN在Immutable.js中认为是与自身相等的