Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/rest/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 有没有更优雅的方法来解决这个Ramda过滤器问题?;_Javascript_Ramda.js - Fatal编程技术网

Javascript 有没有更优雅的方法来解决这个Ramda过滤器问题?;

Javascript 有没有更优雅的方法来解决这个Ramda过滤器问题?;,javascript,ramda.js,Javascript,Ramda.js,我需要过滤: 名称为“筛选器名称”的对象 属性“标记”等于每种类型中“过滤器名称”对象的对象 在本例中,结果是1、3、4、6 有更优雅的方法来解决这个问题吗?使用with获得所有项目的名称等于过滤器名称,并提取标签。然后使用,并列出您提取的标记,以获取具有相关标记的所有项目: const{pipe,filter,propEq,innerJoin,pluck}=R; 常量getFiltered=管道( 过滤器(propEq('name','filter name')), 拔(“标签”) ); c

我需要过滤:

  • 名称为“筛选器名称”的对象
  • 属性“标记”等于每种类型中“过滤器名称”对象的对象
  • 在本例中,结果是1、3、4、6

    有更优雅的方法来解决这个问题吗?

    使用with获得所有项目的名称等于
    过滤器名称,并提取标签。然后使用,并列出您提取的标记,以获取具有相关标记的所有项目:

    const{pipe,filter,propEq,innerJoin,pluck}=R;
    常量getFiltered=管道(
    过滤器(propEq('name','filter name')),
    拔(“标签”)
    );
    const getByTags=arr=>innerJoin(
    (记录,标记)=>record.tag==tag,
    啊,,
    getFiltered(arr)
    );
    const arr=[{“id”:1,“name”:“filter name”,“type”:“type1”,“tag”:“tag1”},{“id”:3,“name”:“name3”,“type”:“type1”,“tag”:“tag1”},{“id”:4,“name”:“filter name”,“type”:“type2”,“tag”:“tag3”},{“id”:6,“name”:“name5”,“type”:“type2”,“tag 3”};
    常量结果=getByTags(arr);
    控制台日志(结果)
    
    下面是一系列的版本,展示了如何在一些自定义组合器的帮助下创建此函数的无点版本。但最后,我认为这根本不值得,另一个带有中间变量的版本——不管是否使用Ramda编写——更具可读性

    第一关 很明显,解决这个问题有两个不同的步骤:第一,找到与
    过滤器名称匹配的标记,第二,找到具有这些标记名称的元素。让我们为这些函数编写函数:

    const标记名=(filterName)=>(arr)=>
    管道(过滤器(propEq('name',filterName)),拔管('tag'))(arr)
    常量getItems=(propNames)=>(arr)=>过滤器(anyPass(map(propEq('tag'),propNames)))(arr)
    常量匹配标记=(过滤器名称)=>(arr)=>
    getItems(标记名(过滤器名称)(arr))(arr)
    const arr=[{id:1,name:'filter name',type:'type1',tag:'tag1'},{id:2,name:'name2',type:'type1',tag2'},{id:3,name:'name3',type:'type1',tag tag:'tag1'},{id:4,type:'type2',tag4'},{id:6,name:'name5',type:'type2',tag3'}]
    console.log(匹配标签('filter-name')(arr))
    
    
    const{pipe,filter,propEq,pulk,anyPass,map}=R
    Hi,是否有任何解决方案来获得结果的补码,我将
    record.tag==tag
    更改为
    record.tag!==标记,但不起作用。谢谢!你的回答对我帮助很大,我以后会仔细考虑免积分方案!
    
    var a = { id: 1, name: 'filter-name', type: 'type1', tag: 'tag1' };
    var b = { id: 2, name: 'name2', type: 'type1', tag: 'tag2' };
    var c = { id: 3, name: 'name3', type: 'type1', tag: 'tag1' };
    var d = { id: 4, name: 'filter-name', type: 'type2', tag: 'tag3' };
    var e = { id: 5, name: 'name4', type: 'type2', tag: 'tag4' };
    var f = { id: 6, name: 'name5', type: 'type2', tag: 'tag3' };
    
    var arr = [a, b, c, d, e, f];
    
    var typeFind = R.curry((type, ex) => R.find(ele => ele.type === type, ex));
    var tagEqProps = R.curry((o1, o2) => R.eqProps('tag', o1, o2));
    var filtered = R.curry((arr, ex) => R.filter(ele => tagEqProps(ele, typeFind(ele.type, ex)), arr));
    
    var excludes = R.filter(ele => ele.name === 'filter-name', arr);
    filtered(arr, excludes);