如何在使用object.key方法时获取json对象的子对象的值?

时间:2013-05-15 12:08:14

标签: javascript jquery

通过使用api并获得响应。作为回应,我得到了名为object的交易中的对象列表,这些对象的计数是19。我使用下面的函数来获取'键'和'值'每个对象。但是一些最终是对象的键具有包含键和值的子对象,我已经尝试过但我无法访问它们。我已经在下面给出了api调用的响应片段。这里我能够访问索引0处于活动状态的对象,但对于业务我得到[对象对象],因为它内部有键和值,即“id”,我无法访问,我也想访问它们。

 meta: Object
       response: Object
           deals: Array[20]
                0: Object
                    active: 1
                    business: Object
                       id: 608290.....

下面是获取键的函数以及所有对象的值

function getAllobjectData(data) {
    $.each(data.response.deals, function (i, deals) {
        console.log("value of index " + i);
        var keys = [],
            values = [];
        $.each(deals, function (key, value) {
            keys.push(key);
            values.push(value);
            var subkey = [],
                subvalue = [];

这部分我添加并尝试获取子对象的键和值,但它没有工作,我不知道这是一个正确的方法。

$.each(key, function (subkey, subvalue) {                          <-------------      
                    alert(subkey + ": " + subkey);                              -
                });                                                             -
                console.log('subkey ' + (i + 1) + ' is ' + subkey);             - 
                console.log('subvalue ' + (i + 1) + ' is ' + subvalue);         -
   ----------------------------------------------------------------------------- 
            });
            console.log('keys ' + (i + 1) + ' is ' + subkey);
            console.log('values ' + (i + 1) + ' is ' + subvalue);

        });
    }

4 个答案:

答案 0 :(得分:2)

优雅地解决这个问题的一种方法是使用recursion

这是一个函数示例,它将以[keyPath, value]的形式返回数组数组:

DEMO:http://jsfiddle.net/RQuBD/1/

function collectSimpleValues(data, values, path) {  
    path = path || '';
    values = values || [];

    Object.keys(data).forEach(function (k) {
        var p = path + k, v = data[k];

        if (typeof v === 'object') collectSimpleValues(v, values, p + '.');
        else values.push([p, v]);
    });

    return values;
}

答案 1 :(得分:1)

我不确定您的需求究竟是什么,但如果您只想访问Deals数组下的对象,可以按以下方式修改您的功能

function getAllobjectData(data) {
    $.each(data.response.deals, function (i, deal) {
        console.log("value of index " + i);
        var keys = [],
            values = [];
        // since you are already looping through deals, no need to create another loop
        console.log(deal.active); //should output 1
        console.log(deal.business.id); should output 608290
        // and so on...
}

答案 2 :(得分:1)

你需要在这里使用递归(如果你不知道对象的深度)。

var meta = {
   response: {
       deals: [
            {
                active: 1,
                business: {
                   id: 608290
                }
            }
        ]
    }
};

// print object
printValue(meta);

function printValue( oValue, sKey )
{
    if( typeof oValue == 'object' || typeof oValue == 'array' )
    {
        for( i in oValue )
        {
            console.log( i + ' is an object' );
            printValue( oValue[i], i );
        }

    }
    else
        console.log( sKey, oValue );
}

答案 3 :(得分:0)

首先,您不必在.each()上不断更改参数。每次调用该功能时,您都可以使用(k, v)和params k&amp;&amp; v将适用于该函数内的任何内容,除非您在另一个.each()中再次使用它们。

我不确定你是JSON还是预期的结果,但是我可以通过一个小小的小提琴来帮助你了解“深潜”是多么容易。

另外,如果您不确定某个值是“字符串”还是“对象”,请不要忘记JavaScript的typeof方法。仅供参考,数组也可以显示为“对象”,如果你想要差异则使用instanceof。虽然您可以在整个JavaScript中使用对象和数组非常相似。例如someArray["someKey"]就像someObject["someKey"]

一样

无论如何,在长长的小提琴上:

jsFiddle

部分代码示例:

var TopLevel_keys = new Array(), TopLevel_values = new Array(), ulTop = $("<ul />", { class: "level-top" }).appendTo($("body"));
$.each(bob, function(k, v) {
    TopLevel_keys.push(k); TopLevel_values.push(v);
    ulTop.append($("<li />", { text: k }));

    var Level01_keys = new Array(), Level01_values = new Array(), ul01 = $("<ul />", { class: "level-01" }).appendTo(ulTop.children("li").last());
    $.each(v, function(k, v) {
        Level01_keys.push(k); Level01_values.push(v);
        ul01.append($("<li />", { text: k }));

        var Level02_keys = new Array(), Level02_values = new Array(), ul02 = $("<ul />", { class: "level-02" }).appendTo(ul01.children("li").last());
        $.each(v, function(k, v) {
            Level02_keys.push(k); Level02_values.push(v);
            ul02.append($("<li />", { text: k }));

            etc ...