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三元函数查找部分匹配项。我的目标是扩展这个函数,以额外获取一系列状态'——我希望以一种简洁、功能性强、易于阅读的风格这样做——这超出了我当前的技能水平。总而言之,标准是:

  • 通过电子邮件输入将部分匹配到userList中的电子邮件属性
  • 状态完全匹配
  • 这两个参数都需要满足

  • 您可以使用
    .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我已经根据你的需要更新了我的答案