Javascript 使用字符串过滤对象数组+;字符串数组
我试图理解如何更好地使用函数式编程来实现代码的整洁。理想情况下,我希望为此使用Javascript 使用字符串过滤对象数组+;字符串数组,javascript,functional-programming,ramda.js,Javascript,Functional Programming,Ramda.js,我试图理解如何更好地使用函数式编程来实现代码的整洁。理想情况下,我希望为此使用ramda.js,但我对任何其他函数库都持开放态度 我有两个参数: emailSearchTermString [{value:'ACTIVE'},{value:'INACTIVE'}]对象数组 我有一个数组,我希望通过上述两个参数进行过滤: [ { email: '123@example.com', status: 'ACTIVE' }, { email: '1234@stacko
ramda.js
,但我对任何其他函数库都持开放态度
我有两个参数:
emailSearchTerm
String[{value:'ACTIVE'},{value:'INACTIVE'}]
对象数组[
{
email: '123@example.com',
status: 'ACTIVE'
},
{
email: '1234@stackoverflow.com',
status: 'INACTIVE'
},
]
如何使用利用两个输入有效过滤对象数组的纯函数
编辑:很好的后续问题:
目前,我使用了使用搜索词的部分过滤:
searchTerm ? userList.filter(user => user.email.toLowerCase()
.indexOf(searchTerm.toLowerCase()) > -1) : userList
userList表示对象数组,而我的searchTerm三元函数查找部分匹配项。我的目标是扩展这个函数,以额外获取一系列状态'——我希望以一种简洁、功能性强、易于阅读的风格这样做——这超出了我当前的技能水平。总而言之,标准是:
您可以使用
.filter
并检查email
属性是否包含emailSearchTerm
字符串和.includes()
函数,并使用.some
(这将测试数组中是否至少有一个元素通过了所提供函数实现的测试)用于通过status
属性进行检查和筛选
const-emailSearchTerm='0123@example.com';
常量arrayCheck=[{value:'ACTIVE'},{value:'INACTIVE'}];
常量用户列表=[
{
电邮:'123@example.com',
状态:“活动”
},
{
电邮:'1234@stackoverflow.com',
状态:“不活动”
},
]
常量pureFunction=(字符串、数组检查、数据)=>
data.filter(项=>
item.email.includes(字符串)
&&arrayCheck.some(obj=>obj.value==item.status));
log(pureFunction(emailSearchTerm、arrayCheck、userList))代码>这里有一种使用普通JavaScript的可能方法
我利用咖喱和部分应用。检查如何匹配电子邮件可以是任何匹配者。我提供了partialMatch
,但是您可以实现任何函数来提供更复杂的匹配器
const=x=>y=>x==y
const contains=xs=>x=>
xs.some(等于(x))
const partialMatch=x=>y=>y.toLowerCase().indexOf(x.toLowerCase())>-1
//请注意,使用{value:'[STATUS]}打开对象数组
//应该转换为字符串数组以使事情更简单!
const anyStatus=包含(['ACTIVE','INACTIVE'])
const activeStatus=包含(['ACTIVE'])
const matchUser=containssstatus=>emailMatcher=>userList=>
userList.filter({email,status})=>
emailMatcher(电子邮件)
&&集装箱状态(状态)
)
const matchAnyUserStatus=matchUser(anyStatus)
常量matchActiveUser=matchUser(activeStatus)
const emailHasAt=partialMatch(“@”)
const emailHas123=partialMatch('123')
常量用户列表=[{
电邮:'123@example.com',
状态:“活动”
},
{
电邮:'1234@stackoverflow.com',
状态:“不活动”
}
]
const output1=matchAnyUserStatus(emailHasAt)(userList)
const output2=matchAnyUserStatus(emailHas123)(userList)
const output3=matchActiveUser(emailHas123)(用户列表)
console.log(output1)
console.log(输出2)
console.log(output3)
下面是一个使用以下方法的解决方案:
const{curry,contains,_uu,其中,filter}=R;//拉姆达
const search=curry(功能(状态、emailMatch、列表){
const email=contains(emailMatch);
const status=包含(状态);
返回筛选器(其中({email,status}),列表);
});
常量用户列表=[
{电子邮件:'john@stackoverflow.com,状态:'活动'},
{电子邮件:'david@gmail.com,状态:'活动'},
{电子邮件:'peter@gmail,状态为“不活动”},
{电子邮件:'tom@stackoverflow.com,状态:'不活动'}
];
const searchActiveUsers=搜索(['ACTIVE']);
const searchAllUsers=搜索(['ACTIVE','INACTIVE']);
const searchActiveSoUsers=searchActiveUsers('stackoverflow');
const searchAllGmail用户=searchAllUsers('gmail');
console.log(searchActiveSoUsers(userList));//厕所
console.log(searchAllgMail用户(用户列表));//大卫和彼得
电子邮件搜索术语的值是多少?期望的结果是什么?哪些字段需要查找?决定是否匹配的标准是什么?到目前为止你尝试了什么?@ilrein我已经根据你的需要更新了我的答案