использовать jQuery’s find () для объекта 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”.
Я пробовал все такие вещи, как:
- Как я могу выбрать элемент с несколькими classами в jQuery?
- jQuery выбирает атрибут с использованием операторов AND и OR
- Является ли jQuery каким-либо кэшированием «селекторов»?
- Какие селектора CSS3 действительно поддерживают jQuery, например: nth-last-child ()?
- Включение / выключение флажков
$(TestObj.find(":id='A'"))
но ничего не работает.
Может ли кто-нибудь подумать о способе получения предмета на основе некоторых критериев без использования «каждого»?
- Селектор атрибутов jQuery для нескольких значений
- jQuery: выбрать class элемента и идентификатор одновременно?
- Селекторы jQuery с переменными
- Более чистый способ выбора нескольких возможных значений атрибутов?
- Как я могу определить, возвращает ли селектор null?
- jQuery получить все div, которые не имеют атрибута classа
- : nth-of-type () в jQuery / Sizzle?
- jQuery ИЛИ Селектор?
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 и / или map . Вероятно, не намного лучше, чем использовать $ .each
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. });
Возвращает массив совпадающих объектов или возвращаемых значений в случае карты. Возможно, вы сможете делать то, что хотите, просто используя их.
Но в этом примере вам придется сделать некоторую рекурсию, потому что данные не являются плоским массивом, и мы принимаем произвольные структуры, ключи и значения, как и чистые решения 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’)]” btw. Возможно, его нужно настроить с помощью консоли браузера)
Другой вариант, который я хотел упомянуть, вы могли бы преобразовать ваши данные в XML, а затем использовать jQuery.find(":id='A'")
так, как вы хотели.
Для этого есть плагины jQuery, такие как json2xml .
Вероятно, не стоит накладных расходов на конвертацию, но это одноразовая стоимость для статических данных, поэтому это может быть полезно.