我试图同时了解组合函数和纯函数。
我有一个混合数据的对象。在某些值上,我需要:
- 删除值的单位
- 将字符串解析为整数
- 转换为值十进制
我写了三个函数,试图使它们纯粹,因为它们只做一件事,但严格来说,它们是变异状态。我不确定如何避免改变状态,如果这在技术上使它不是一个纯函数?
我的三个"纯"函数是:
function parseValue(val) {
return typeof val === 'number' ? val : parseInt(val)
}
function stripUnits(val) {
return typeof val === 'string' ? val.match(/d+/)[0] : val
}
function convertToDecimal(val) {
return val / 100
}
然后,我尝试在 lodash 的帮助下将这些函数组合成一个函数compose()
function prepValue(val) {
return compose(stripUnits, parseValue, convertToDecimal)
}
当我尝试运行此console.log("prepValue", prepValue(weather.current.temperature))
时,我在终端中得到以下内容:
prepValue function (){var n=arguments,e=n[0];if(o&&1==n.length&&of(e))return o.plant(e).value();for(var u=0,n=r?t[u].apply(this,n):e;++u<r;)n=t[u].call(this,n);return n}
所以最主要的是,
- 如何让我的三个功能"纯粹"
- 如何将这些函数组合成 1
您犯的唯一错误是没有调用以 val
作为参数的结果组合方法:
function prepValue(val) {
return compose(stripUnits, parseValue, convertToDecimal)(val);
}
在调用它之前,你需要"创建函数组合"。
function parseValue(val) { console.log(val)
return typeof val === 'number' ? val : parseInt(val)
}
function stripUnits(val) { console.log(val)
return typeof val === 'string' ? val.match(/d+/)[0] : val
}
function convertToDecimal(val) {console.log(val)
return val / 100
}
function prepValue(val) {
return _.compose(stripUnits, parseValue, convertToDecimal)(val);
}
console.log("prepValue", prepValue('001232'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.5/lodash.fp.js"></script>