используйте поиск 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'"))
но ничего не работает.
может ли кто-нибудь придумать способ извлечения элемента на основе некоторых критериев без использования "каждого"?
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