0

JavaScriptに次のようなオブジェクトがあります。

{"data":[{"t":{
                "level":"35",
                "longtitude":"121.050321666667",
                "latitude":"14.6215366666667",
                "color":"#040098"}},
         {"t":{
                "level":"31",
                "longtitude":"121.050316666667",
                "latitude":"14.621545",
                "color":"#040098"}},
         {"t":{
                "level":"29",
                "longtitude":"121.050323333333",
                "latitude":"14.62153",
                "color":"#040098"}},
//  .....

私がやりたいのは、オブジェクトのコンテンツを反復処理して、オブジェクトをそれぞれの配列に個別にプッシュできるようにすることです。経度、緯度、色、レベルの配列があります。

だから私は次のことを試しました:

var size = 0, key;
for (key in result) {
    if (result.hasOwnProperty(key)) size++;
    alert(result.data[size]);
}

->しかし、これは私に「[オブジェクトオブジェクト]」を警告するだけです

success: function(result){
    var size = 0, key;
    for (key in result) {
        for(var attr in key){
            alert(attr['latitude']);
        }
    }
}

->これは私に未定義の結果を与えます[キー]

これらのコードを使用して、オブジェクトのサイズが1つしかないことを確認しました

var size = 0, key;
for (key in result) {
    if (result.hasOwnProperty(key)) size++;
}
alert(size);        

「データ」だけが読まれていると思います。そして、「データ」の中にある他のものは無視されます。

私はこれを読みましたこれここにリンクの説明を入力してください、そしてこれ は、オブジェクトの異なる構造を扱っているようです。高度なヘルプをありがとう。

UPDATE console.log()を使用して、最初の属性のみがフェッチされていることを誤解していないかどうかを確認しました

t
    Object { level="35", longtitude="121.0508", latitude="14.6204083333333", more...}
color       "#040098"
latitude    "14.6204083333333"
level       "35"
longtitude  "121.0508"

私はこれを試しました

for (key in result) {
            if (result.hasOwnProperty(key)) size++;
            console.log(result.data[size]['level']);
        }

->しかしそれは未定義と言います

私のオブジェクトの構造に基づいています

data:[{"t":{'others'},'others'...]

「データ」内のすべてを読み取るにはどうすればよいですか?各「データ」には「t」があります。

4

4 に答える 4

1

更新:for...in配列を反復処理するために構造を使用することはお勧めしません。別の方法は、通常のforループです(もちろん、各メソッドにはそれぞれの利点があります)。

for(var i=0; i<results.data.length; i++){
    alert(results.data[i]['t']['latitude']);
    // etc...
}


JSONの構造に注意してください。また、javascript foreachループは、値ではなく、キー/インデックスを反復処理することに注意してください。デモを参照してください:http://jsfiddle.net/g76tN/

success: function(result){
    var latitudes = [];
    // and so on...

    for (var idx in result.data ) {
        if( result.data.hasOwnProperty(idx) ){
            alert( result.data[idx]['t']['latitude'] );

            // So you would do something like this:
            latitudes.push ( result.data[idx]['t']['latitude'] );
            // and so on...
        }
    }
}​

配列内のオブジェクトのプロパティを収集するための注意、jQuery$.map()(またはそのことについてはネイティブjs配列マップ)は、きちんとした便利な代替手段です。

var latitudes = $.map( result.data, function(n){
    return n['t']['latitude'];
});
// and so on...
于 2012-07-17T01:46:42.730 に答える
1

あなたのオブジェクトがあなたのオブジェクトであると仮定すると、これはあなたの配列resultを反復することの問題であるはずです:data

for (var i = 0; i < result.data.length; ++i) {
    console.log(result.data[i].t.latitude);
    ...
}
于 2012-07-17T01:49:17.940 に答える
1

以下に示すように、それは難しいことではありません。しかし、なぜあなたはあなたtのような有用なオブジェクトを取り、それらをそのような配列に変えたいのでしょうか?

var levels = [], longitudes= [], latitudes = [], colors = [];
var result = {"data":[{"t":{
            "level":"35",
            "longtitude":"121.050321666667",
            "latitude":"14.6215366666667",
            "color":"#040098"}},
     {"t":{
            "level":"31",
            "longtitude":"121.050316666667",
            "latitude":"14.621545",
            "color":"#040098"}},
     {"t":{
            "level":"29",
            "longtitude":"121.050323333333",
            "latitude":"14.62153",
            "color":"#040098"}}
]};

var data = result.data;
var i, len, t;

for (i = 0, len = data.length; i < len; i++) {
    t = data[length].t;
    levels[i] = t.level;
    longitudes[i] = t.longtitude;
    latitudes[i] = t.latitude;
    colors[i] = t.color;   
}
于 2012-07-17T01:51:50.547 に答える
0

(重要な)を保持するhttp://jsfiddle.net/VGmee/hasOWnPropertyと、そうではない「経度」のスペルミスを参照してください。

var data = input.data,
    result = {level: [], longtitude: [], latitude: [], color: []};

for (var i = 0, n = data.length; i < n; i += 1) {
    var info = data[i].t;
    for (var property in info) {
        if (info.hasOwnProperty(property)) {
            result[property].push(info[property]);
        }
    }
}

console.log(result.level);
console.log(result.latitude);
console.log(result.longtitude);
console.log(result.color);

これには、結果の配列が実際に入力配列のプロパティを持っている必要がありますが、必要に応じてエラー処理を追加できます。

于 2012-07-17T01:51:06.903 に答える