Вы можете использовать что-то вроде этого для сравнения двух объектов Javascript:
// returns true if "obj" contains "other" as a subset
contains = function(obj, other) {
return Object.keys(other).every(function(key) {
return other[key] == obj[key];
});
}
например, contains(users[0], {profile: 'student'} )
возвращает true
.
Как только мы получим это, все остальное легко:
userFilter = { ...criteria... }
results = users.filter(function(item) { return contains(item, userFilter) })
Обратите внимание, что это соответствует AND
сопоставлению, то есть, если фильтр равен {state:5, profile:'student'}
, он находит записи, которые имеют и состояние = 5, и профиль = ученик. Для сопоставления OR
замените every()
на some()
в приведенном выше коде.
Согласно вашему комментарию, вышеприведенную функцию можно обобщить, добавив функцию сравнения в качестве параметра:
contains = function(obj, other, compare) {
return Object.keys(other).every(function(key) {
return compare ? compare(key, obj[key], other[key])
: obj[key] == other[key];
});
}
Функция сравнения принимает ключ, значение объекта и значение фильтра и должна возвращать true или false. Пример: * +1021 *
user = {
"id": "52",
"name": "Foo Bar"
}
// this uses the default "equals" comparison and fails
contains(user, { name: "Foo" });
// this uses a custom "indexOf" comparison and succeeds
contains(user, { name: "Foo" }, function(key, val, flt) {
return val.indexOf(flt) >= 0;
});