Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/430.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/Functional languages/Libraries中组合多个filter()谓词_Javascript_Dictionary_Filter_Functional Programming_Underscore.js - Fatal编程技术网

Javascript 在下划线/Ramda/Functional languages/Libraries中组合多个filter()谓词

Javascript 在下划线/Ramda/Functional languages/Libraries中组合多个filter()谓词,javascript,dictionary,filter,functional-programming,underscore.js,Javascript,Dictionary,Filter,Functional Programming,Underscore.js,对于数据列表,我想使用几个谓词对其进行过滤,然后对每个过滤器执行一个操作 如果我的数据是: var people = [ {name: 'Sachin', profession: 'doctor', cases: 12}, {name: 'Djokovic', profession: 'lawyer', cases: 14}, {name: 'Paes', profession: 'doctor', cases: 36}, {name

对于数据列表,我想使用几个谓词对其进行过滤,然后对每个过滤器执行一个操作

如果我的数据是:

var people = [
    {name: 'Sachin',    profession: 'doctor',   cases: 12},
    {name: 'Djokovic',  profession: 'lawyer',   cases: 14},
    {name: 'Paes',      profession: 'doctor',   cases: 36},
    {name: 'Jordan',    profession: 'lawyer',   cases: 78},
    {name: 'Williams',  profession: 'doctor',   cases: 30},
    {name: 'Nehwal',    profession: 'lawyer',   cases: 75}
]
我想将其转换为:

var peopleWithoutCases = [
    {name: 'Sachin',    profession: 'doctor',   patients:   12, cases: 12},
    {name: 'Djokovic',  profession: 'lawyer',   courtcases: 14, cases: 14},
    {name: 'Paes',      profession: 'doctor',   patients:   36, cases: 36},
    {name: 'Jordan',    profession: 'lawyer',   courtcases: 78, cases: 78},
    {name: 'Williams',  profession: 'doctor',   patients:   30, cases: 30},
    {name: 'Nehwal',    profession: 'lawyer',   courtcases: 75, cases: 75}
]
有这样一种优雅的功能方法吗

    people
    .filter (person => person.profession == 'doctor')
    .map    (person => {
                person.patients = person.cases
                return person;
            })
    .filter (person => person.profession == 'lawyer')
    .map    (person => {
                person.courtcases = person.cases
                return person;
            })
问题是第一个
map
返回一个数组,其中只有
doctor
s。因此,第二个
过滤器
返回
[]

我知道我能做到:

_.union(
    people
        .filter (person => person.profession == 'doctor')
        .map    (person => {
                    person.patients = person.cases
                    return person;
                }),
    people
        .filter (person => person.profession == 'lawyer')
        .map    (person => {
                    person.courtcases = person.cases
                    return person;
                })
)
如果我错了,请纠正我,但是,在我看来,随着数组列表的增加和谓词数量的增加,这需要一种多通道的方法来解决这个问题,这是低效的

用命令式方法写这篇文章很容易。带有多个
if
语句的单个
for
循环。高效但不优雅:)

请建议使用下划线、LoDash或优秀的RamdaJS库等功能性javascript的最佳方法。在纯函数语言中是如何实现的

注:

  • 在这种情况下,数组顺序并不重要
  • 请不要从字面上理解这个例子并建议替代解决方案,我想要一个用于过滤和映射多个谓词的通用解决方案
  • 试一试:

    var el=document.getElementById('dbg');
    var$l=函数(val){
    el.innerHTML=el.innerHTML+'
    
    试着这样做:

    var el=document.getElementById('dbg');
    var$l=函数(val){
    el.innerHTML=el.innerHTML+'
    
    试着这样做:

    var el=document.getElementById('dbg');
    var$l=函数(val){
    el.innerHTML=el.innerHTML+'
    
    试着这样做:

    var el=document.getElementById('dbg');
    var$l=函数(val){
    el.innerHTML=el.innerHTML+'
    
    用于迭代对象,克隆对象(使用或)以防止更改原始对象,并使用以下方法应用过滤器:

    var people=[{“姓名”:“Sachin”,“职业”:“医生”,“案例”:12},{“姓名”:“德约科维奇”,“职业”:“律师”,“案例”:14},{“姓名”:“Paes”,“职业”:“医生”,“案例”:36},{“姓名”:“约旦”,“职业”:“律师”,“案例”:78},{“姓名”:“威廉姆斯”,“职业”:“医生”,“案例”:30},{“姓名”:“内瓦尔”,“职业”:“律师”,“案例”:75};
    var propsMap={
    “医生”:“病人”,
    “律师”:“法庭案件”
    };
    变量过滤器=[
    功能案例2教授(人){
    person[propsMap[person.profession]=person.cases;
    返回人;
    },
    功能移除酶(人){
    删除person.case;
    返回人;
    }
    ];
    var结果=应用过滤器(人员、过滤器);
    函数applyFilters(数组、筛选器){
    返回数组.map(函数(项){
    var cloned=Object.assign({},item);//克隆对象以防止对原始对象进行变异
    //在对象上运行所有筛选器
    返回过滤器.reduce(函数(对象,过滤器){
    返回过滤器(克隆);
    },克隆);
    });
    }
    控制台。表格(结果);
    document.getElementById('demo')。innerHTML=JSON.stringify(结果,null');
    用于迭代对象,克隆对象(使用或)以防止更改原始对象,并使用以下方法应用过滤器:

    var people=[{“姓名”:“Sachin”,“职业”:“医生”,“案例”:12},{“姓名”:“德约科维奇”,“职业”:“律师”,“案例”:14},{“姓名”:“Paes”,“职业”:“医生”,“案例”:36},{“姓名”:“约旦”,“职业”:“律师”,“案例”:78},{“姓名”:“威廉姆斯”,“职业”:“医生”,“案例”:30},{“姓名”:“内瓦尔”,“职业”:“律师”,“案例”:75};
    var propsMap={
    “医生”:“病人”,
    “律师”:“法庭案件”
    };
    变量过滤器=[
    功能案例2教授(人){
    person[propsMap[person.profession]=person.cases;
    返回人;
    },
    功能移除酶(人){
    删除person.case;
    返回人;
    }
    ];
    var结果=应用过滤器(人员、过滤器);
    函数applyFilters(数组、筛选器){
    返回数组.map(函数(项){
    var cloned=Object.assign({},item);//克隆对象以防止对原始对象进行变异
    //在对象上运行所有筛选器
    返回过滤器.reduce(函数(对象,过滤器){
    返回过滤器(克隆);
    },克隆);
    });
    }
    控制台。表格(结果);
    document.getElementById('demo')。innerHTML=JSON.stringify(结果,null');
    用于迭代对象,克隆对象(使用或)以防止更改原始对象,并使用以下方法应用过滤器:

    var people=[{“姓名”:“Sachin”,“职业”:“医生”,“案例”:12},{“姓名”:“德约科维奇”,“职业”:“律师”,“案例”:14},{“姓名”:“Paes”,“职业”:“医生”,“案例”:36},{“姓名”:“约旦”,“职业”:“律师”,“案例”:78},{“姓名”:“威廉姆斯”,“职业”:“医生”,“案例”:30},{“姓名”:“内瓦尔”,“职业”:“律师”,“案例”:75};
    var propsMap={
    “医生”:“病人”,
    “律师”:“法庭案件”
    };
    变量过滤器=[
    功能案例2教授(人){
    person[propsMap[person.profession]=person.cases;
    返回人;
    },
    功能移除酶(人){
    删除person.case;
    返回人;
    }
    ];
    var结果=应用过滤器(人员、过滤器);
    函数applyFilters(数组、筛选器){
    返回数组.map(函数(项){
    var cloned=Object.assign({},item);//克隆对象以防止对原始对象进行变异
    //在对象上运行所有筛选器
    返回过滤器.reduce(函数(对象,过滤器){
    返回过滤器(克隆);
    },克隆);
    });
    }
    控制台。表格(结果);
    document.getElementById('demo')。innerHTML=JSON.stringify(结果,null');
    用于迭代对象,克隆对象(使用或)以防止更改原始对象,并使用以下方法应用过滤器:

    var people=[{“姓名”:“Sachin”,“职业”:“医生”,“案例”:12},{“姓名”:“德约科维奇”,“职业”:“律师”,“案例”:14},{“姓名”:“Paes”,“职业”:“医生”,“案例”:36},{“姓名”:“约旦”,“职业”:“律师”,“案例”:78},{“姓名”:“威廉姆斯”,“职业”:“医生”,“案例”:30},{“姓名”:“内瓦尔”,“职业”:“劳伊”