在JSON对象上使用jQuery的find()
与brnwdrng的问题类似,我正在寻找一种通过类似JSON的对象进行search的方法。
假设我的对象的结构是这样的:
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'"))
但似乎没有任何工作。
任何人都可以想到一种基于某些标准检索项目而不使用“每个”的方法?
jQuery不适用于普通的对象文字。 您可以使用下面的函数以类似的方式search所有的id(或任何其他属性),而不pipe对象的深度如何:
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解决scheme更好,但jQuery的方式是使用jQuery的grep和/或地图方法。 可能不会比使用$ .each好多less
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中查找值的数组。 可能能够做到你想要的只是使用这些。
但在这个例子中,你必须做一些recursion,因为数据不是一个平面数组,我们正在接受任意的结构,键和值,就像纯JavaScript解决scheme一样。
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返回一个结果数组
(我还没有testingexpression式“$ .. [?(@。id =='A')]”btw。也许需要在浏览器控制台的帮助下进行微调)
我想提到的另一个选项是,可以将数据转换为XML,然后按照您的要求使用jQuery.find(":id='A'")
。
有jQuery插件的效果,如json2xml 。
可能不值得的转换开销,但这是静态数据的一次性成本,所以它可能是有用的。