2017-10-26 2 views
1

I ein JSON Objekt wie so haben:durch Objekte in JSON Array Looping

{ 
    "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 
     } 
     ] 
    } 
    ] 
} 

I können die Titel Schleife durch und hängen sie an den Körper, wie ich würde nun durch jede Objekt-Schleife in der "enthaltenen Übungen "array und drucken Sie jeden Wert: Name, Dauer und Pause, pro Objekt. Ich habe nicht viel Erfolg und ich frage mich, ob ich meine JSON-Struktur ändern sollte oder ob ich in meinen Loops einen dummen Fehler mache. Ich verwende Firebase übrigens, keine AJAX-Anrufe oder ähnliches.

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

entfernen 'var obj = Training [i] .exercises;' und 'ersetzen für (obj in Training)' mit 'für (obj in Training [i] .exercises)'. Sie überschreiben die 'obj'-Variable und durchlaufen das falsche Array, es sei denn, ich bin falsch. – powerbuoy

+1

Die Benutzeroberfläche basierend auf JSON-Objekten ist so gut mit etwas wie [Aurelia] (http://aurelia.io/) btw. Nur eine Seite. – powerbuoy

Antwort

1

for..in Verwendung durch Arrays iterieren im Allgemeinen keine gute Idee, in JS ist. Versuchen Sie Array.forEach mit durch alle Elemente im Array zu gehen, statt:

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

Das ist großartig! Vielen Dank! Ich suchte nach jedem Dokument online, aber ein n00b zu sein war irgendwie verloren, wie man sie richtig benutzt. – Brian

1

Versuchen Sie, diese

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

Es sei hier ein bisschen logischer Fehler ist. Sie möchten den Namen exercise erhalten, nicht den Namen workout.

1

Solange modernere JS in Ordnung ist, würde ich wahrscheinlich vorschlagen, dass Sie array.prototype.forEach mit einem Rückruf in beiden Ihren Schleifen verwenden.

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)); 
 
});

Für weitere Abwärtskompatibilität können Sie wie so verschachtelten Schleifen tun:

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

Lösung mit nur Karte zu schreiben versucht() Operator

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

Das ist ganz toll! – Brian