1

APIを使用して応答を取得します。応答では、オブジェクトという名前の取引のオブジェクトのリストを取得し、これらのオブジェクトの数は19です。以下の関数を使用して、それぞれの「キー」と「値」を取得しましたオブジェクト.しかし、最終的にオブジェクトであるいくつかのキーには、キーと値を含むサブオブジェクトがあります.インデックス 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

これをエレガントに解決する 1 つの方法は、再帰を使用することです。

配列の配列を次の形式で返す関数の例を次に示します[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

ここで再帰を利用する必要があります (オブジェクトの深さが分からない場合)。

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 に答える
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 に答える
0

まず第一に、.each() でパラメーターを変更し続ける必要はありません。その関数を呼び出すたび(k, v)に、別の .each() でそれらを再度使用しない限り、params k && v を使用するだけで、その関数内にあるものすべてに適用されます。

あなたが正確な JSON であるか、期待される結果であるかはわかりませんが、「ディープ ダイビング」がいかに簡単であるかを示すのに役立つかもしれないちょっとしたフィドルをまとめました。

また、値が「文字列」なのか「オブジェクト」なのかわからない場合は、JavaScript の typeof メソッドを忘れないでください。参考までに、違いが必要な場合は、配列も「オブジェクト」として表示できますinstanceof。ただし、JavaScript 全体でオブジェクトと配列をほぼ同じように使用できます。たとえば、次のようsomeArray["someKey"]に機能しますsomeObject["someKey"]

とにかく、長いフィドルを続けてください:

jsフィドル

コードの例:

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 に答える