在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 。

可能不值得的转换开销,但这是静态数据的一次性成本,所以它可能是有用的。