-2
{
    "Items": [
        {
            "local": "padaria",
            "item1": "leite",
            "item2": "pao"
        }

    ],
}

問題は、私がうまくいかず、次のJSONエラーが発生していることです。

エラー: Uncaught ReferenceError: item1 が定義されていません

私のコード:

var obj = jQuery.parseJSON(retorno);

for (var i = 0; i < obj[0].Items.length; i++) {
    function getObjectLength(obj) {
        var length = 0;

        for (var p in obj) {
            if (obj.hasOwnProperty(p)) {
                length++;
            }
        }

        return length;
    }

    var t;

    for (var a = 0; a < getObjectLength(obj[0].Items[i]); a++) {
        if (a > 0) {
            t = (obj[0].Items[i].
                'item' + a);
        }

        console.log(obj[0].Items[i].t);
        console.log(t);
    };


    $("#thelist").append('<li>' + obj[0].Items[i].local + '</li>');

}
4

2 に答える 2

4

これについて確認してください:

1)

 {
"Items": [
    {
        "local": "padaria",
        "item1": "leite",
        "item2": "pao"
    }],
}

"]" の後にコンマがある (これはご存知のとおりです:P) パーサーが JSON を解析しないようにします

2)

     for (var a = 0; a < getObjectLength(obj[0].Items[i]); a++) {
     if (a > 0) {
         t = (obj[0].Items[i].
             'item' + a);
     }

構文エラーが発生しました ==> obj[0].Items[i].'item'

このように someobj.'key' を使用することはできません

someobj["key"] または someobj.key を使用できます

于 2013-06-16T18:57:36.247 に答える
3

コードにはいくつかの問題があります。私はフィドルでそれを修正しました

の結果はvar obj = jQuery.parseJSON(retorno);1 つのアイテムを持つオブジェクトでした"Items"。これは、以降の呼び出しを or または または のいずれかとして実行する必要があることを意味しました"Items"obj[0]obj.Itemsobj["Items"]

しかし、あなたはそれを次のようにしていました:

for (var i = 0; i < obj[0].Items.length; i++) {

これは基本的に見つけようとして失敗していましたobj.Items.Items!

次の問題は、順番に名前が付けられたプロパティにアクセスしようとしていた方法でした"item" + a。名前検索の生成は動的であるため、Object Named-Key 表記がそれにアクセスする正しい方法でした。

そのコードはに変換する必要がありましたobj.Items[0].["item" + a]


次に、いくつかの優れたプラクティスについて説明します。

  • JSON の末尾にコンマがあります。現在、ほとんどのブラウザは問題なく解析できますが、古いバージョンの IE は失敗します。とにかく、これは悪い習慣です。

  • Javascript のオブジェクト、関数、変数などは関数内でスコープされるため、元のコードの一部は、巻き上げ/スコープの問題として定義されているものに対して脆弱でした。関数宣言はブロック内に配置しないでください。関数式を使用するか、ステートメントを外側の関数の先頭に移動してください。

    したがって、外側のfor()ループは次のいずれかに変更されます。

    //Move outside, into the outermost block
    function getObjectLength(obj) {
        //...
    }
    for (var i = 0; i < obj.Items.length; i++) {
        //...
    }
    

    または

    for (var i = 0; i < obj.Items.length; i++) {
        //Function Expression
        var getObjectLength = function (obj) {
            //...
        };
    
        //...
    }
    

    ここで後者の関数式手法を使用する際の問題は、ループ内で関数を作成するのは良くないということです。ループの反復ごとに新しいインスタンスが作成されるためです。


固定コード:

var obj = jQuery.parseJSON(retorno);
for (var i = 0; i < obj.Items.length; i++) {
    function getObjectLength(obj) {
        var length = 0;
        for (var p in obj) {
            if (obj.hasOwnProperty(p)) {
                length++;
            }
        }
        return length;
    }
    var t;
    for (var a = 0; a < getObjectLength(obj.Items[i]); a++) {
        if (a > 0) {
            t = (obj.Items[i]['item' + a]);
        }
        console.log(obj.Items[i].t);
        console.log(t);
    };
    $("#thelist").append('<li>' + obj[0].Items[i].local + '</li>');
}
于 2013-06-16T18:49:05.680 に答える