используйте поиск jQuery () на объекте JSON



аналогично вопрос brnwdrng, Я ищу способ поиска через JSON-подобный объект.

предположим, что структура моего объекта такова:



TestObj = {
"Categories": [{
"Products": [{
"id": "a01",
"name": "Pine",
"description": "Short description of pine."
},
{
"id": "a02",
"name": "Birch",
"description": "Short description of birch."
},
{
"id": "a03",
"name": "Poplar",
"description": "Short description of poplar."
}],
"id": "A",
"title": "Cheap",
"description": "Short description of category A."
},
{
"Product": [{
"id": "b01",
"name": "Maple",
"description": "Short description of maple."
},
{
"id": "b02",
"name": "Oak",
"description": "Short description of oak."
},
{
"id": "b03",
"name": "Bamboo",
"description": "Short description of bamboo."
}],
"id": "B",
"title": "Moderate",
"description": "Short description of category B."
}]
};


Я хотел бы получить объект с id="A".



Я пробовал все виды вещей, таких как:



$(TestObj.find(":id='A'"))


но ничего не работает.



может ли кто-нибудь придумать способ извлечения элемента на основе некоторых критериев без использования "каждого"?

728   6  

6 ответов:

jQuery не работает на простых объектных литералах. Вы можете использовать приведенную ниже функцию аналогичным образом для поиска всех ' id (или любого другого свойства), независимо от его глубины в объекте:

function getObjects(obj, key, val) {
    var objects = [];
    for (var i in obj) {
        if (!obj.hasOwnProperty(i)) continue;
        if (typeof obj[i] == 'object') {
            objects = objects.concat(getObjects(obj[i], key, val));
        } else if (i == key && obj[key] == val) {
            objects.push(obj);
        }
    }
    return objects;
}

использовать вот так:

getObjects(TestObj, 'id', 'A'); // Returns an array of matching objects

чистое решение javascript лучше, но способ jQuery будет использовать jQuery grep и/или карта методы. Вероятно, не намного лучше, чем использование $.каждый

jQuery.grep(TestObj, function(obj) {
    return obj.id === "A";
});

или

jQuery.map(TestObj, function(obj) {
    if(obj.id === "A")
         return obj; // or return obj.name, whatever.
});

возвращает массив совпадающих объектов или искомых значений в случае map. Возможно, вы сможете делать то, что хотите, просто используя их.

но в этом примере вам придется сделать некоторую рекурсию, потому что данные не являются плоскими массив, и мы принимаем произвольные структуры, ключи и значения, так же, как это делают чистые решения javascript.

function getObjects(obj, key, val) {
    var retv = [];

    if(jQuery.isPlainObject(obj))
    {
        if(obj[key] === val) // may want to add obj.hasOwnProperty(key) here.
            retv.push(obj);

        var objects = jQuery.grep(obj, function(elem) {
            return (jQuery.isArray(elem) || jQuery.isPlainObject(elem));
        });

        retv.concat(jQuery.map(objects, function(elem){
            return getObjects(elem, key, val);
        }));
    }

    return retv;
}

по существу то же самое, что и ответ Box9, но с использованием функций утилиты jQuery, где это полезно.

········

это работает для меня на [{"id": "data"}, {"id":"data"}]

function getObjects(obj, key, val) 
{
    var newObj = false; 
    $.each(obj, function()
    {
        var testObject = this; 
        $.each(testObject, function(k,v)
        {
            //alert(k);
            if(val == v && k == key)
            {
                newObj = testObject;
            }
        });
    });

    return newObj;
}

для одного измерения json вы можете использовать это:

function exist (json, modulid) {
    var ret = 0;
    $(json).each(function(index, data){
        if(data.modulId == modulid)
            ret++;
    })
    return ret > 0;
}

можно использовать JSONPath

делать что-то вроде этого:

results = JSONPath(null, TestObj, "$..[?(@.id=='A')]")

отметим, что JSONPath возвращает массив результатов

(Я не проверял выражение "$..[? (@. id=='A')]" кстати. Может быть, его нужно доработать с помощью консоли браузера)

еще один вариант, который я хотел бы упомянуть, вы можете конвертировать ваши данные в XML, а затем использовать jQuery.find(":id='A'") Как вы и хотели.

есть плагины jQuery для этого эффекта, например json2xml.

вероятно, не стоит накладных расходов на преобразование, но это одноразовая стоимость для статических данных, поэтому это может быть полезно.

Comments

    Ничего не найдено.