Immutable

Immutable API 简介

Immutable的数据类型

  1. List: 有序索引集,类似JavaScript中的Array。
  2. Map: 无序索引集,类似JavaScript中的Object。
  3. OrderedMap: 有序的Map,根据数据的set()进行排序。
  4. Set: 没有重复值的集合。
  5. OrderedSet: 有序的Set,根据数据的add进行排序。
  6. Stack: 有序集合,支持使用unshift()和shift()添加和删除。
  7. Range(): 返回一个Seq.Indexed类型的集合,这个方法有三个参数,start表示开始值,默认值为0,end表示结束值,默认为无穷大,step代表每次增大的数值,默认为1.如果start = end,则返回空集合。
  8. Repeat(): 返回一个vSeq.Indexe类型的集合,这个方法有两个参数,value代表需要重复的值,times代表要重复的次数,默认为无穷大。
  9. Record: 一个用于生成Record实例的类。类似于JavaScript的Object,但是只接收特定字符串为key,具有默认值。
  10. Seq: 序列,但是可能不能由具体的数据结构支持。
  11. Collection: 是构建所有数据结构的基类,不可以直接构建。

API

  1. 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())
    })

  2. toJS()
    作用:将一个Immutable数据转换为JS类型的数据。

    用法:value.toJS()

  3. 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
    });
  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

  5. 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中认为是与自身相等的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值