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},{“姓名”:“内瓦尔”,“职业”:“劳伊”