mori.js 中文API(親測)

b10l07發表於2017-08-07

這裡不講函式式的概念,因為既然你搜到這篇文章,你已經讀了不少晦澀難懂的文字了。所以這裡只會介紹mori.js 這個庫的API

mori的資料結構

  • 向量 Vector
    帶有索引(index)的一組資料和js的array非常像,不過它是不可變和永續性的機構。
    建立的方法是:

      mori.vector(1,2,3,4)
      // =>[1,2,3,4]
    

    獲取向量的元素

      let vec = mori.vector(1,2,3,4)
      mori.get(vec,0)
    

    新增向量的元素

      mori.conj(vec,5)  // =>[1,2,3,4,5]
      vec   //=>[1,2,3,4]
    

    刪除向量的尾部元素

      mori.pop(vec)  // =>[1,2,3]
      vec   //=>[1,2,3,4]
    

    獲取向量的首個和剩餘元素

      mori.first(vec)    //=>  1
      mori.rest(vec)    //=>  ( 2 3 4 ) 注意這裡是( )
    

    獲取子向量(subvec)

      mori.subvec(vec,1)    //=>  [2 3 4 ]
      mori.subvec(vec,1,2)    //=>  [2]
      vec  // =>[1,2,3,4]
    

    FYI:向量的所有操作都是不可變的

  • Map
    這個是JS的語法:

      let map = new Map();
      map.set(0,'零');   // => Map {0=>'零'}
      map.set(1,'一');   // => Map {0=>'零',1=>'一'}
    

    我們可以使用mori.hashMap建立一個hashMap的例項,同樣所有操作都不會改變原來的不可變物件

      let m = mori.hashMap('零',0,'一',1);   // =>{'零' 0, '一' 1}
      mori.get(m,'零')    // =>0
      let m1 = mori.assoc(m,mori.vector(1,2),2);  //更新操作
      // m1 =>{'零' 0, '一' 1,[1 2] 2}
      // m =>{'零' 0, '一' 1}
      mori.get(m1, mori.vector(1, 2))  // =>2
      mori.assoc(mori.vector(1, 2, 3), 1, 8);
      // => [1,8,3]
      mori.conj(m,mori.vector("foo","bar"));
      // => {'零' 0, '一' 1 , "foo" "bar"}
    

函式組合子

  • filter
      mori.filter(mori.isEven,[1,2,3,4,5])
    
    Array也有filter方法
    [1,2,3,4,5].filter(x => x%2 == 0)
  • reduce
      mori.reduce( (a,b) => a+b,0, [ 1, 2, 3, 4,5])
      //  => 15
    
    第一個函式是規定引數,第二個是初始值,第三個集合

mori.equals(x, y)

判斷兩個引數的值是否相等。適用所有Mori的模型,進行深度對比。

var l1 = mori.list(1,2,3);
var l2 = mori.list(1,2,3);
mori.equals(l1, l2); // => true
 
var v = mori.vector(1,2,3);
mori.equals(v, l1); // => true
 
var m0 = mori.toClj({foo: 1});
var m1 = mori.toClj({foo: 1});
mori.equals(m0, m1); // => true

mori.hash(x)

把mori的物件Hash值化。說白了就是把mori的物件轉為唯一Id

var l = mori.list(1, 2, 3);
var v = mori.vector(1, 2, 3);
 
mori.hash(l) == mori.hash(v); // => true

mori.isList(coll)

判斷是否是mori的List物件

var l = mori.list(1, 2, 3);    
console.log(mori.isList(l))//true

mori.isSeq(coll)

翻譯來說是判斷是否序列號。不過寫Test.實在看不出有什麼規律

mori. isVector(coll)

判斷是否是mori的Vector物件

var v = mori.vector(1, 2, 3);
console.log('isVector'+mori.isVector(v))

mori.isMap(coll)

判斷是否是mori的 Map物件

var v = mori.hashMap(1, 2, 3);
console.log('isVector'+mori.isMap(v))

mori.isSet(coll)

判斷是否是mori的Set物件

var s = mori.set(["bird", "cat", "dog"]);
console.log('set'+mori.isSet(s))

mori.isCollection(coll)

判斷是否是mori的物件,Set,Lists,Maps,Vectors都是Collection的物件

var s = mori.set(["bird", "cat", "dog"]);
console.log('set'+mori. isCollection(s))

mori. isSequential(coll)

判斷是否是mori的物件,Set,Lists,Maps,Vectors都是Collection的物件

var s = mori.set(["bird", "cat", "dog"]);
console.log('set'+mori. isCollection(s))

相關文章