1

通过使用 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

4 回答 4

2

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

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

演示: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;
}
于 2013-05-15T13:09:26.303 回答
1

我不确定您到底需要什么,但如果您只想访问交易数组下的对象,您可以修改您的函数,如下所示

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...
}
于 2013-05-15T12:51:43.367 回答
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 );
}
于 2013-05-15T12:54:27.007 回答
0

首先,您不必不断更改 .each() 上的参数。每次调用该函数时,您都可以使用(k, v)并且参数 k && 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 ...
于 2013-05-15T13:18:49.563 回答