loda sh _.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']
Я хочу объединить 2, преобразовав свойство соответствия в функцию соответствия, как показано в функции 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;
};
Однако он не работает должным образом ( ссылка на игровую площадку ).
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
, он работает, Отфильтровывая Барни.
Может кто-нибудь помочь мне понять, почему? Спасибо