2

値を取得しようとしているjsonファイルがあります。このファイルでは、1 つのオブジェクトが別のオブジェクト内にネストされています。最上位の値は分離できますが、ネストされた値は分離できません。構文の問題に違いありません。これが私が使用しているものです。

これはjsonです:

{
    "total": [
        [
            {
                "votes": "79,060"
            },
            {
                "percent": "11%"
            },
            {
                "winner": "0"
            }
        ],
        [
            {
                "votes": "167,800"
            },
            {
                "percent": "22%"
            },
            {
                "winner": "0"
            }
        ],
        [
            {
                "votes": "51,519"
            },
            {
                "percent": "7%"
            },
            {
                "winner": "0"
            }
        ],
        [
            {
                "votes": "297,060"
            },
            {
                "percent": "39%"
            },
            {
                "winner": "1"
            }
        ],
        [
            {
                "votes": "156,787"
            },
            {
                "percent": "21%"
            },
            {
                "winner": "0"
            }
        ]
    ],
    "useWinnerColors": 1,
    "timestamp": "3:00 p.m. April 26",
    "candidateCount": 5
}

私が書くとき:

console.log(json.candidateCount);

正しい答えが得られました (5)。

しかし、私が書くとき:

console.log(json.total[0][1]);

オブジェクト {パーセント = "11%"} を取得します。

そして、私が書くとき:

console.log(json.total[0].votes);

私は未定義になります。

「合計」で項目の値を分離するにはどうすればよいですか?

4

2 に答える 2

5

それ自体が配列であるundefinedため、取得しています。json.total[0]の特定の配列を分離する必要があります。したがって、またはのようなことをする必要があります。 json.total[0]json.total[0][0].votesjson.total[0][1].votes

JSON のより良い構造は次のようになると思います。

{"total": [    
   {
      "votes": "79,060"
      "percent": "11%"
      "winner": "0",
   },
   ...
   {
      "votes": "156,787",
      "percent": "21%",
      "winner": "0"
   }], 
   "useWinnerColors": 1,
   "timestamp": "3:00 p.m. April 26",
   "candidateCount": 5
}

できるようになりjson.total[0].votesました。

各エントリが名前と値のペアである配列を作成する必要はありません。連想配列を直接使用できます。

EDIT : 連想配列を反復処理するfor..inには、 with を使用しhasOwnProperty()ます。このhasOwnProperty()チェックにより、継承したプロパティを反復処理できなくなります (一部のサードパーティ ライブラリは名前空間を汚染します)。

var map = json.total[0];
for(var prop in map) if(map.hasOwnProperty(prop)) {
   var value = map[prop];
   ...
}
于 2012-06-29T17:36:28.147 に答える
3

各 '[' 記号は、配列を処理し、各 '{' - オブジェクトを処理することを意味します。実際json.totalには、オブジェクトの配列の配列も同様です (ただし、各内部オブジェクトは単なる「タプル」であり、単一のキーと値のペアです。

そう...

json.total[0][1]- { 'percent': '11%' } に評価されます

json.total[0]['votes']- 1 つのステップがスキップされるため、何も評価されません (未定義)。json.total[0][n].votes) それは本当にorであるべきjson.total[0][n]['votes']です。これら 2 つの形式は (ほぼ) 同じです。)

于 2012-06-29T17:37:42.993 に答える