首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在JSON对象上使用jQuery的find()

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

Stack Overflow用户
提问于 2011-02-14 20:56:54
回答 5查看 259.2K关注 0票数 73

brnwdrng's question类似,我正在寻找一种搜索类似JSON的对象的方法。

假设我的对象的结构如下:

代码语言:javascript
复制
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”的对象。

我尝试过所有的东西,比如:

代码语言:javascript
复制
$(TestObj.find(":id='A'"))

但似乎什么都不起作用。

有没有人能想出一种不使用“each”就能基于某种标准检索项目的方法呢?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-02-14 21:02:22

jQuery不适用于纯对象文字。您可以以类似的方式使用下面的函数来搜索所有‘id’(或任何其他属性),而不管其在对象中的深度如何:

代码语言:javascript
复制
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;
}

像这样使用:

代码语言:javascript
复制
getObjects(TestObj, 'id', 'A'); // Returns an array of matching objects
票数 120
EN

Stack Overflow用户

发布于 2011-08-11 21:28:04

纯javascript解决方案更好,但jQuery方法是使用jQuery grep和/或map方法。可能并不比使用$.each好多少

代码语言:javascript
复制
jQuery.grep(TestObj, function(obj) {
    return obj.id === "A";
});

代码语言:javascript
复制
jQuery.map(TestObj, function(obj) {
    if(obj.id === "A")
         return obj; // or return obj.name, whatever.
});

返回匹配对象的数组,如果是map,则返回查找的值的数组。也许可以简单地使用它们来做你想做的事情。

但在本例中,您必须执行一些递归操作,因为数据不是平面数组,而且我们可以接受任意的结构、键和值,就像纯javascript解决方案一样。

代码语言: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实用函数。

···

票数 52
EN

Stack Overflow用户

发布于 2012-02-21 06:31:34

适用于我的{"id":"data"},{"id":"data"}

代码语言:javascript
复制
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;
}
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4992383

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档