在 JSON 对象上使用 jQuery 的 find()

问题来了类似,我正在寻找一种方法来搜索类似 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'"))

但似乎没什么效果。

有没有人能想出一种方法来检索一个项目基于一些标准而不使用“每个”?

263101 次浏览

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和/或 地图方法。 可能不会比使用 $. 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.
});

返回匹配对象的数组,或者在 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 实用函数。

········

我想提到的另一个选项是,您可以将数据转换为 XML,然后按照您希望的方式使用 jQuery.find(":id='A'")

有一些 jQuery 插件可以达到这种效果,比如 Json2xml

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

这对我来说适用于[{“ 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返回一个结果数组

(我还没有测试“ $”这个短语。.[?(@.顺便说一句。也许需要在浏览器控制台的帮助下进行微调)