Leo*_*ban 8 javascript functional-programming object ramda.js
http://ramdajs.com/0.21.0/docs/#prop
var myObject = {a: 1, b: 2, c: 3, d: 4};
var newObject = R.filter(R.props('a'), myObject);
//var newObject = R.filter(R.equals(R.props('a')), myObject);
console.log('newObject', newObject);
Run Code Online (Sandbox Code Playgroud)
现在,上面的代码返回整个对象:
newObject
{"a":1,"b":2,"c":3,"d":4}
我想做的只是用'a'钥匙返回一个新对象.或者带有a和b键的新对象.
Jar*_*ith 15
使用选择:
let newObj = R.pick(['a'], oldObj);
Run Code Online (Sandbox Code Playgroud)
如果您的过滤条件比仅存在更复杂,则可以使用pickBy通过任意谓词函数进行选择.
贾里德史密斯的答案很棒.我只想添加一个说明为什么你的代码不起作用的说明.你试过了
R.filter(R.props('a'), {a: 1, b: 2, c: 3, d: 4});
Run Code Online (Sandbox Code Playgroud)
首先,您指出了文档prop,但使用过props.这些是不同但相关的功能. prop好像
// prop :: k -> {k: v} -> v
prop('c', {a: 1, b: 2, c: 3, d: 4}); //=> 3
Run Code Online (Sandbox Code Playgroud)
(有一些额外的复杂性undefined.)
props 另一方面需要多个值
// props :: [k] -> {k: v} -> [v]
props(['a', 'd'], {a: 1, b: 2, c: 3, d: 4}); //=> [1, 4]
Run Code Online (Sandbox Code Playgroud)
但这些都不是有用的输入filter,为了这些目的我们可以想到
// filter :: (k -> Bool) -> {k: v} -> {k: v}
Run Code Online (Sandbox Code Playgroud)
第一个参数filter是从(字符串)键到布尔值的函数; 它适用于Javascript的想法,除了一些特定的值,一切都是真实的.它将依次用每个键调用.因此,例如,当决定是否包括时{c: 3},它调用props('a')('c'),这是另一个有点奇怪的原因*,实际上有效,返回[3],被视为真实y,并且过滤器函数将包括{c: 3}在其输出中.所以每个键也都包括在内.
*props('a', obj)真正应该的原因props(['a'], obj)是,在JS中,字符串足够接近列表,具有length属性和索引值. 'a'.length; ==> 1,'a'[0]; //=> 'a'.因此props可以将单字符字符串视为字符串的单元素列表.但它也有点奇怪: R.props('cabby', {a: 1, b: 2, c: 3, d: 4}); //=> [3, 1, 2, 2, undefined].
const getOnlyGoods = R.pickBy((_, key) => key.includes('good'));
const onlyGoods = getOnlyGoods({
"very good": 90,
"good": 80,
"good enough": 60,
"average": 50,
"bad": 30,
"": 10,
});
console.log(onlyGoods);Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.25.0/ramda.min.js"></script>Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7343 次 |
| 最近记录: |