ramda.js
2019-09-01 18:36:52 0 举报
AI智能生成
Ramda.js常用方法使用总结
作者其他创作
大纲/内容
一款实用的 JavaScript 函数式编程库,类似的还有Underscore 和 Lodash
https://ramdajs.com/docs/
http://ramda.cn/docs/
https://ramdajs.com/docs/
http://ramda.cn/docs/
Why use Ramda.js but not Underscore 和 Lodash
1、前两者的参数位置不对,把处理的数据放到了第一个参数。
如:var square = n => n * n;
_.map([4, 8], square) // [16, 64]
Ramda 的数据一律放在最后一个参数,理念是"function first,data last"。
2、Ramda 还有一个特点:所有方法都支持柯里化,也就是说,所有多参数的函数,默认都可以单参数使用。
1、前两者的参数位置不对,把处理的数据放到了第一个参数。
如:var square = n => n * n;
_.map([4, 8], square) // [16, 64]
Ramda 的数据一律放在最后一个参数,理念是"function first,data last"。
2、Ramda 还有一个特点:所有方法都支持柯里化,也就是说,所有多参数的函数,默认都可以单参数使用。
常用API
R.or
只要有一个参数为 truth-y,就返回 true;否则返回 false。
R.is
检测一个对象(val)是否是给定构造函数的实例,如R.is(Object, {}); //=> true 、R.is(Number, 1); //=> true
R.contains
Deprecated since v0.26.0 从v0.26.0废弃,使用includes代替
R.includes
只要列表中有一个元素等于指定值,则返回 true;否则返回 false。也可以判断字符串中是否包含指定值。如:R.includes(3, [1, 2, 3]); //=> true 、R.includes('ba', 'banana'); //=>true
空值判断
R.isNil
检测输入值是否为 null 或 undefined。如:R.isNil(null); //=> true 、R.isNil(undefined); //=> true
R.isEmpty
检测给定值是否为其所属类型的空值,若是则返回 true ;否则返回 false。如:R.isEmpty([1, 2, 3]); //=> false 、R.isEmpty([]); //=> true
R.map
R.omit
过滤指定属性,删除对象中给定的 keys 对应的属性。 如:R.omit(['a', 'd'])({a: 1, b: 2, c: 3, d: 4})// {b: 2, c: 3}
R.dissoc
删除对象中指定 prop 属性。如:R.dissoc('b', {a: 1, b: 2, c: 3}); //=> {a: 1, c: 3}
R.equals
R.pickBy
返回对象的部分拷贝,其中仅包含 key 满足 predicate 的属性。
如:const isUpperCase = (val, key) => key.toUpperCase() === key;
R.pickBy(isUpperCase, {a: 1, b: 2, A: 3, B: 4}); //=> {A: 3, B: 4}
R.pickBy(isUpperCase, {a: 1, b: 2, A: 3, B: 4}); //=> {A: 3, B: 4}
R.pick
返回对象的部分拷贝,其中仅包含指定键对应的属性。如果某个键不存在,则忽略该属性。如:R.pick(['a', 'd'], {a: 1, b: 2, c: 3, d: 4}); //=> {a: 1, d: 4}
R.test
R.last
R.reduce
R.defaultTo
如果第二个参数不是 null、undefined 或 NaN,则返回第二个参数,否则返回第一个参数(默认值)。如:R.defaultTo('Add New', "啊哈哈哈") //啊哈哈哈
R.gte
R.lt
R.gt
R.join
R.head
R.keys
R.once
R.length
R.addIndex
R.path
取出给定路径上的值。如:R.path(['a', 'b'], {a: {b: 2}}); //=> 2 、R.path(['a', 'b'], {c: {b: 2}}); //=> undefined
R.pathOr
如果非空对象在给定路径上存在值,则将该值返回;否则返回给定的默认值。
如:R.pathOr('N/A', ['a', 'b'], {a: {b: 2}}); //=> 2 、R.pathOr('N/A', ['a', 'b'], {c: {b: 2}}); //=> "N/A"
如:R.pathOr('N/A', ['a', 'b'], {a: {b: 2}}); //=> 2 、R.pathOr('N/A', ['a', 'b'], {c: {b: 2}}); //=> "N/A"
R.concat
R.append
R.compose
从右往左执行函数组合(右侧函数的输出作为左侧函数的输入)。最右侧函数可以是任意元函数(参数个数不限),其余函数必须是一元函数。
如:const classyGreeting = (firstName, lastName) => "The name's " + lastName + ", " + firstName + " " + lastName
const yellGreeting = R.compose(R.toUpper, classyGreeting);
yellGreeting('James', 'Bond'); //=> "THE NAME'S BOND, JAMES BOND"
const yellGreeting = R.compose(R.toUpper, classyGreeting);
yellGreeting('James', 'Bond'); //=> "THE NAME'S BOND, JAMES BOND"
对象合并
R.merge
合并两个对象的自身属性(不包括 prototype 属性)。如果某个 key 在两个对象中都存在,使用后一个对象对应的属性值。
R.merge({ 'name': 'fred', 'age': 10 }, { 'age': 40 }); //=> { 'name': 'fred', 'age': 40 }
R.merge({ 'name': 'fred', 'age': 10 }, { 'age': 40 }); //=> { 'name': 'fred', 'age': 40 }
R.mergeAll
将对象类型列表合并为一个对象。
R.mergeAll([{foo:1},{bar:2},{baz:3}]); //=> {foo:1,bar:2,baz:3}
R.mergeAll([{foo:1},{foo:2},{bar:2}]); //=> {foo:2,bar:2}
R.mergeAll([{foo:1},{bar:2},{baz:3}]); //=> {foo:1,bar:2,baz:3}
R.mergeAll([{foo:1},{foo:2},{bar:2}]); //=> {foo:2,bar:2}
R.mergeDeepLeft
合并两个对象的自身属性(不包括 prototype 属性)。如果某个 key 在两个对象中都存在:1、并且两个值都是对象,则继续递归合并这两个值。2、否则,采用第一个对象的值。
R.mergeDeepLeft({ name: 'fred', age: 10, contact: { email: 'moo@example.com' }}, { age: 40, contact: { email: 'baa@example.com' }});//=> { name: 'fred', age: 10, contact: { email: 'moo@example.com' }}
R.mergeDeepLeft({ name: 'fred', age: 10, contact: { email: 'moo@example.com' }}, { age: 40, contact: { email: 'baa@example.com' }});//=> { name: 'fred', age: 10, contact: { email: 'moo@example.com' }}
R.mergeDeepRight
合并两个对象的自身属性(不包括 prototype 属性)。如果某个 key 在两个对象中都存在:1、并且两个值都是对象,则继续递归合并这两个值。2、否则,采用第二个对象的值。
R.mergeDeepRight({ name: 'fred', age: 10, contact: { email: 'moo@example.com' }},{ age: 40, contact: { email: 'baa@example.com' }});//=> { name: 'fred', age: 40, contact: { email: 'baa@example.com' }}
R.mergeDeepRight({ name: 'fred', age: 10, contact: { email: 'moo@example.com' }},{ age: 40, contact: { email: 'baa@example.com' }});//=> { name: 'fred', age: 40, contact: { email: 'baa@example.com' }}
R.__
柯里化函数的参数占位符。允许部分应用于任何位置的参数。
const greet = R.replace('{name}', R.__, 'Hello, {name}!');
greet('Alice'); //=> 'Hello, Alice!'
const greet = R.replace('{name}', R.__, 'Hello, {name}!');
greet('Alice'); //=> 'Hello, Alice!'
R.curry
R.split
R.without
R.memoizeWith
R.prop
取出对象中指定属性的值。如果不存在,则返回 undefined。
如:R.prop('x', {x: 100}); //=> 100 、R.prop('x', {}); //=> undefined
如:R.prop('x', {x: 100}); //=> 100 、R.prop('x', {}); //=> undefined
R.propOr
对于给定的非空对象,如果指定属性存在,则返回该属性值;否则返回给定的默认值。
如:const alice = {
name: 'ALICE',
age: 101
};
R.propOr({}, 'promoCodes',alice) // =>{}
name: 'ALICE',
age: 101
};
R.propOr({}, 'promoCodes',alice) // =>{}
R.flatten
R.pluck
从列表内的每个对象元素中取出特定名称的属性,组成一个新的列表。
如:R.pluck(0, [[1, 2], [3, 4]]); //=> [1, 3] 、R.pluck('val', {a: {val: 3}, b: {val: 5}}); //=> {a: 3, b: 5}
如:R.pluck(0, [[1, 2], [3, 4]]); //=> [1, 3] 、R.pluck('val', {a: {val: 3}, b: {val: 5}}); //=> {a: 3, b: 5}
R.not
R.always
R.cond
R.and
R.zipObj
将两个列表对应位置的元素作为键值对组合,生成一个新的键值对的列表。如:R.zipObj(['a', 'b', 'c'], [1, 2, 3]); //=> {a: 1, b: 2, c: 3}
R.take
返回列表的前 n 个元素、字符串的前n个字符。如:R.take(1, ['foo', 'bar', 'baz']); //=> ['foo']
0 条评论
下一页