这里不讲函数式的概念,因为既然你搜到这篇文章,你已经读了不少晦涩难懂的文字了。所以这里只会介绍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
Array也有filter方法mori.filter(mori.isEven,[1,2,3,4,5])
[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))
网友评论