фильтровать объект javascript - PullRequest
       3

фильтровать объект javascript

1 голос
/ 29 февраля 2012

У меня есть объект javascript, который может быть что-то вроде этого

{
    "users": [{
        "id": "52",
        "name": "User name one",
        "profile": "student",
        "statusId": 1
    },...

Я хочу изменить свойства этого объекта с помощью набора параметров.По сути, я хочу новый объект, свойства которого могут соответствовать набору ограничений - объект фильтра - с такой формой (пустой фильтр):

    var userFilter = {
        id : "",
        name: "",
        profile : "",
        state : ""
    };

Я видел Array.prototype.filter , но не могу придумать простой и понятный способ использования всех свойств фильтра.Я попробовал этот подход со строкой javascript, которая объединяет все фильтры и использует eval (), но мне не нравится этот подход.Любое предложение?

Заранее спасибо, с уважением

1 Ответ

3 голосов
/ 29 февраля 2012

Вы можете использовать что-то вроде этого для сравнения двух объектов 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;
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...