2017-10-26 24 views
1

に、私はそうのようなJSONオブジェクトを持っている:JSON配列

{ 
    "workouts": 
    [ 
    { 
     "title": "Full Body", 
     "exercises": 
     [ 
     { 
      "name": "Push Ups", 
      "duration": 3, 
      "break": 3 
     }, 
     { 
      "name": "Squats", 
      "duration": 3, 
      "break": 3 
     }, 
     { 
      "name": "Running in Place", 
      "duration": 3, 
      "break": 3 
     } 
     ] 
    }, 
    { 
     "title": "God Legs", 
     "exercises": 
     [ 
     { 
      "name": "Running in Place (High Knees)", 
      "duration": 3, 
      "break": 3 
     }, 
     { 
      "name": "Squats", 
      "duration": 3, 
      "break": 3 
     }, 
     { 
      "name": "Clams", 
      "duration": 3, 
      "break": 3 
     } 
     ] 
    }, 
    { 
     "title": "Morning Stretch", 
     "exercises": 
     [ 
     { 
      "name": "Downward Dog", 
      "duration": 3, 
      "break": 3 
     }, 
     { 
      "name": "Face Plant", 
      "duration": 3, 
      "break": 3 
     }, 
     { 
      "name": "Warrior", 
      "duration": 3, 
      "break": 3 
     } 
     ] 
    } 
    ] 
} 

私はタイトルをループし、身体にそれらを追加し、今私は "に含まれる各オブジェクトをループしたいことができますそれぞれの値を出力します:名前、継続時間、ブレーク、オブジェクトごと。私は多くの成功を収めているわけではありません。JSONの構造を変更する必要があるのか​​、自分のループで何かばかげたミスを犯しているのだろうかと思います。私はFirebaseを途中で使用していますが、AJAXコールなどはありません。

はJavaScript:

// Initialize firebase. 
firebase.initializeApp(config); 

var dbRef = firebase.database().ref().child("workouts"); 

// Sync with Firebase in real time. 
dbRef.on("value", snap => 
{ 
    var workouts = snap.val(); 

    // HAVE A LOOP FOR EVERY ARRAY INJSON. 
    for (var i = 0; i < workouts.length; i++) 
    { 
    window.alert(i + workouts[i].title); // Works fine. 

    var obj = workouts[i].exercises; 
    for (obj in workouts) 
    { 
     alert(obj.name); // Returns undefined for each object. 
    } 
    } 
}); 
+0

[I] .exercises 'VAR OBJ =トレーニングを削除し、'と ''(トレーニングにおけるOBJ [I] .exercises)のための 'と(トレーニングでOBJ)は'置き換えます。私が誤解されていない限り、あなたは 'obj'変数を上書きし、間違った配列をループします。 – powerbuoy

+1

JSONオブジェクトに基づいてUIを実行すると、[Aurelia](http://aurelia.io/)btwのようなものでとてもうれしいです。ちょうど脇に。 – powerbuoy

答えて

1

の配列を反復処理するfor..inを使用したが、一般的にJSで素晴らしいアイデアではありません。代わりに、アレイ内のすべての項目を通過するArray.forEachを使用してみてください:

var obj = workouts[i].exercises; 
obj.forEach(function(exercise) { 
    alert(exercise.name); 
}); 
+0

それは素晴らしいです!ありがとうございました!私はそれぞれのドキュメントをオンラインで探していましたが、n00bであることは、それらを正しく使用する方法がちょっと分かりませんでした。 – Brian

1

は、それはここで論理障害のビットです。この

var obj = workouts[i].exercises; 
for (index in obj) { 
    console.log(obj[index].name); 
} 

を試してみてください。 という名前ではなく、exerciseの名前を取得したいとします。

1

限り、より近代的なJSがOKであると、私はおそらく、あなたのループの両方でのコールバックでarray.prototype.forEachを使用することをお勧め。

const data = {"workouts":[{"title":"Full Body","exercises":[{"name":"Push Ups","duration":3,"break":3},{"name":"Squats","duration":3,"break":3},{"name":"Running in Place","duration":3,"break":3}]},{"title":"God Legs","exercises":[{"name":"Running in Place (High Knees)","duration":3,"break":3},{"name":"Squats","duration":3,"break":3},{"name":"Clams","duration":3,"break":3}]},{"title":"Morning Stretch","exercises":[{"name":"Downward Dog","duration":3,"break":3},{"name":"Face Plant","duration":3,"break":3},{"name":"Warrior","duration":3,"break":3}]}]} 
 

 
data.workouts.forEach(workout => { 
 
    workout.exercises.forEach(exercise => console.log(workout.title, '---', exercise.name)); 
 
});

より後方互換性のために、あなたはそうのようなネストされたループを行うことができます:ちょうどマップ()演算子でソリューションを書くこと

const data = {"workouts":[{"title":"Full Body","exercises":[{"name":"Push Ups","duration":3,"break":3},{"name":"Squats","duration":3,"break":3},{"name":"Running in Place","duration":3,"break":3}]},{"title":"God Legs","exercises":[{"name":"Running in Place (High Knees)","duration":3,"break":3},{"name":"Squats","duration":3,"break":3},{"name":"Clams","duration":3,"break":3}]},{"title":"Morning Stretch","exercises":[{"name":"Downward Dog","duration":3,"break":3},{"name":"Face Plant","duration":3,"break":3},{"name":"Warrior","duration":3,"break":3}]}]}; 
 

 
for (let i = 0, len = data.workouts.length; i < len; i++) { 
 
    let exercises = data.workouts[i].exercises; 
 
    for (let x = 0, l = exercises.length; x < l; x++) { 
 
    console.log(data.workouts[i].title, '---', data.workouts[i].exercises[x].name); 
 
    } 
 
}

1

を試してみました

var mainObj = { 
 
    "workouts": 
 
    [ 
 
{ 
 
    "title": "Full Body", 
 
    "exercises": 
 
    [ 
 
    { 
 
     "name": "Push Ups", 
 
     "duration": 3, 
 
     "break": 3 
 
    }, 
 
    { 
 
     "name": "Squats", 
 
     "duration": 3, 
 
     "break": 3 
 
    }, 
 
    { 
 
     "name": "Running in Place", 
 
     "duration": 3, 
 
     "break": 3 
 
    } 
 
    ] 
 
}, 
 
{ 
 
    "title": "God Legs", 
 
    "exercises": 
 
    [ 
 
    { 
 
     "name": "Running in Place (High Knees)", 
 
     "duration": 3, 
 
     "break": 3 
 
    }, 
 
    { 
 
     "name": "Squats", 
 
     "duration": 3, 
 
     "break": 3 
 
    }, 
 
    { 
 
     "name": "Clams", 
 
     "duration": 3, 
 
     "break": 3 
 
    } 
 
    ] 
 
}, 
 
{ 
 
    "title": "Morning Stretch", 
 
    "exercises": 
 
    [ 
 
    { 
 
     "name": "Downward Dog", 
 
     "duration": 3, 
 
     "break": 3 
 
    }, 
 
    { 
 
     "name": "Face Plant", 
 
     "duration": 3, 
 
     "break": 3 
 
    }, 
 
    { 
 
     "name": "Warrior", 
 
     "duration": 3, 
 
     "break": 3 
 
    } 
 
    ] 
 
} 
 
    ] 
 
} 
 

 
mainObj["workouts"].map(obj => obj["exercises"].map(exercises => console.log(obj["title"]+"-->"+exercises["name"])))

+0

それはとても素晴らしいです! – Brian