iterando tramite json object javascript

Sto facendo davvero fatica a trovare un modo per scorrere questo object JSON nel modo che mi piacerebbe. Sto usando solo Javascript qui.

Innanzitutto, ecco l’object

{ "dialog": { "dialog_trunk_1":{ "message": "This is just a JSON Test" }, "dialog_trunk_2":{ "message": "and a test of the second message" }, "dialog_trunk_3": { "message": "This is a test of a bit longer text. Hopefully this will at the very least create 3 lines and trigger us to go on to another box. So we can test multi-box functionality, too." } } } 

In questo momento sto solo provando i metodi di base per passare a ogni dialog_trunk su questo object. Preferisco idealmente far scorrere l’object e per ciascun trunk, visualizzare il suo valore di message .

Ho provato ad usare un ciclo for per generare al volo il nome / numero del dialog_trunk, ma non posso accedere all’object usando una stringa per il nome dell’object, quindi non sono sicuro di dove andare da qui.

Per questo usi un ciclo for..in . Assicurati di controllare se l’object possiede le proprietà o tutte le proprietà ereditate sono mostrate pure. Un esempio è come questo:

 var obj = {a: 1, b: 2}; for (var key in obj) { if (obj.hasOwnProperty(key)) { var val = obj[key]; console.log(val); } } 

O se hai bisogno di una ricorsione per percorrere tutte le proprietà:

 var obj = {a: 1, b: 2, c: {a: 1, b: 2}}; function walk(obj) { for (var key in obj) { if (obj.hasOwnProperty(key)) { var val = obj[key]; console.log(val); walk(val); } } } walk(obj); 

Il mio problema era in realtà un problema di pianificazione errata con l’object JSON piuttosto che un problema logico reale. Quello che ho finito è stato organizzare l’object come segue, secondo un suggerimento da parte dell’utente2736012.

 { "dialog": { "trunks":[ { "trunk_id" : "1", "message": "This is just a JSON Test" }, { "trunk_id" : "2", "message": "This is a test of a bit longer text. Hopefully this will at the very least create 3 lines and trigger us to go on to another box. So we can test multi-box functionality, too." } ] } } 

A quel punto, sono stato in grado di fare un ciclo for abbastanza semplice basato sul numero totale di oggetti.

 var totalMessages = Object.keys(messages.dialog.trunks).length; for ( var i = 0; i < totalMessages; i++) { console.log("ID: " + messages.dialog.trunks[i].trunk_id + " Message " + messages.dialog.trunks[i].message); } 

Il mio metodo per ottenere totalMessages non è supportato in tutti i browser, però. Per il mio progetto, in realtà non importa, ma stai attento se scegli di usare qualcosa di simile a questo.

Ecco il mio approccio ricorsivo:

 function visit(object) { if (isIterable(object)) { forEachIn(object, function (accessor, child) { visit(child); }); } else { var value = object; console.log(value); } } function forEachIn(iterable, functionRef) { for (var accessor in iterable) { functionRef(accessor, iterable[accessor]); } } function isIterable(element) { return isArray(element) || isObject(element); } function isArray(element) { return element.constructor == Array; } function isObject(element) { return element.constructor == Object; }