lodash _.filter
允许按匹配属性和匹配函数进行筛选。
提供以下数据
var users = [
{ 'user': 'barney', 'age': 36, 'active': true },
{ 'user': 'fred', 'age': 40, 'active': false }
];
我是说匹配属性
_.filter(users, { 'age': 36, 'active': true });
// => objects for ['barney']
我是说匹配函数
_.filter(users, function(o) { return !o.active; });
// => objects for ['fred']
functionPredicate
功能。
const functionPredicate = values => {
let funcPredicate = _.identity;
Object.entries(values).forEach(([fieldName, fieldValue]) => {
if (_.isFunction(fieldValue)) {
funcPredicate = funcPredicate && fieldValue;
} else {
const newPredicate = item => item[fieldName] === fieldValue;
funcPredicate = funcPredicate && newPredicate;
}
});
return funcPredicate;
};
然而,它并没有像预期的那样工作(
playground link
).
const _ = require('lodash');
var users = [
{ 'user': 'barney', 'age': 36, 'active': true },
{ 'user': 'fred', 'age': 40, 'active': false },
{ 'user': 'john', 'age': 40, 'active': false },
{ 'user': 'seth', 'age': 44, 'active': true },
];
const functionPredicate = values => {
let funcPredicate = _.identity;
Object.entries(values).forEach(([fieldName, fieldValue]) => {
if (_.isFunction(fieldValue)) {
funcPredicate = funcPredicate && fieldValue;
} else {
const newPredicate = item => (item[fieldName] === fieldValue);
funcPredicate = funcPredicate && newPredicate;
}
});
return funcPredicate;
};
const values = {'ageFp': user => user.age > 36, 'active': true}
const p = functionPredicate(values)
_.filter(users, p) // wrong, it gives me both barney and seth
// _.chain(users).filter({'active': true}).filter(user => user.age > 36).value() // correct, it gives me seth
'active': true
从
values
,它确实有效,过滤掉了巴尼。
有人能帮我理解为什么吗?谢谢