Вы можете взять что-то вроде этого, где вы различаете $and
и $or
или функции.
Это работает, беря объект с ключами для методов массива, таких как Array#every
, который действует как логический и проверяет значения в объекте и возвращает true
, если все элементы с их обратными вызовами возвращают истинное значение.Аналог работает Array#some
, но необходим только один элемент, обратный вызов которого возвращает истинное значение.
Другой объект содержит функции и позволяет получить к ним доступ с помощью клавиши.
Первая пар проверяет, является ли параметр функцией, и если да, то возвращает результат вызова.
Затем параметр получает проверку, и если falsy , например, null
или если значение не является объектом, функция завершается с false
.
. Для получения пары ключ / значение выполняется деструктурирующее присвоение с первой записью из объекта.
Если key
находится в объекте оператора, значение берется как метод для итерации value
и возвращается.
Если key
находится в объекте функций, то функциявызывается с value
в качестве параметра и возвращается.
Наконец, возвращается false
, поскольку никакая другая проверка не была истинной и условие не может быть разрешено.
function evaluate(object) {
var operators = { $or: 'some', $and: 'every' },
fns = {
foo: items => items.indexOf("foo") >= 0,
bar: items => items.indexOf("bar") >= 0,
baz: items => items.indexOf("baz") >= 0
},
key,
value;
if (typeof object === 'function') return object();
if (!object || typeof object !== 'object') return false;
[key, value] = Object.entries(object)[0];
if (key in operators) return value[operators[key]](evaluate);
if (key in fns) return fns[key](value);
return false;
}
var m = 4,
n = 1,
object = {
$or: [
{
$and: [
{ foo: ['foo', 'x'] },
{ bar: ['bar', 'y'] }
]
},
{ baz: ['baz', 'z'] },
() => m < n
]
},
result = evaluate(object);
console.log(result);