javascript - javascript中的纯函数
问题描述
我知道函数需要是纯粹的以避免副作用。例如下面的函数:
//Approach 1
buildValidationErrors(state){
let validationErrors = [];
if(state.name === null)
{
validationErrors.push("Name");
}
if(state.email === null)
{
validationErrors.push("Email");
}
if(state.mobile === null)
{
validationErrors.push("mobile");
}
return validationErrors;
}
//Approach 2
_buildError(state,itemName,validationErrors){
if(state[itemName] === null){
validationErrors.push(itemName);
}
}
buildValidationErrors1(state){
let validationErrors = [];
_buildError(state,"Name",validationErrors );
_buildError(state,"Email",validationErrors);
_buildError(state,"mobile",validationErrors);
return validationErrors;
}
在“方法 1”中,您有一个构建数组的长函数。在“方法 2”中,我将可重用逻辑提取到“_buildError”以避免逻辑重复。
然而,在方法 2 中,参数 validationErrors 被传入并且它也被更新,导致函数在我的理解中变得“不纯”。
从这个角度来看,函数能不能纯粹而紧凑?
解决方案
我会考虑
_buildError(state,itemName){
return state[itemName] === null ? itemName : null;
}
// reduce if you need more than one thing in the validation array
let validationErrors = ["Name","Email","mobile"]
.reduce((acc,item) => {
if (_buildError(state,item)) acc.push({item,something:state[item].something}); return acc },
[] );
// filter if you just need the item name
let validationErrors = ["Name","Email","mobile"]
.filter(item => _buildError(state,item));
推荐阅读
- lua - 如何获取 Lua 支持的整数范围?
- php - Magento 2 在管理面板的订单部分创建按钮
- sql - 在 sql 中按比例分配日期范围的多年策略
- python - 主菜单帮助(pygame)
- r - R Shiny 根据 DT 的自定义表容器的输入更改列名
- javascript - 如何使用字符串文字生成正则表达式?
- mongodb - MongoDB 2.4 不允许在 fileSize~=2GB 但 dataSize~1MB 之后创建集合
- macos - 您没有 /Library/Ruby/Gems/2.3.0 目录的写入权限
- javascript - 试图从整页中获取所有复选框
- python - 在 Cygwin 上安装 MySQL for Python