首页 > 解决方案 > 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 被传入并且它也被更新,导致函数在我的理解中变得“不纯”。

从这个角度来看,函数能不能纯粹而紧凑?

标签: javascriptfunctional-programming

解决方案


我会考虑

_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));

推荐阅读