iteracja poprzez JSON object javascript

Naprawdę ciężko mi znaleźć sposób na iterację przez ten obiekt JSON w taki sposób, jaki bym chciał. Używam tutaj tylko Javascript.

Po pierwsze, oto obiekt

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

W tej chwili próbuję tylko uzyskać dostęp do każdego dialog_trunk na tym obiekcie. Najlepiej przełączyć się przez obiekt i dla każdego pnia wyświetlić jego wartość message.

Próbowałem użyć pętli for, aby wygenerować nazwę / numer dialog_trunk w locie, ale nie mogę uzyskaj dostęp do obiektu za pomocą ciągu znaków dla nazwy obiektu, więc nie jestem pewien, dokąd się stąd udać.

Author: Eric, 2013-10-11

3 answers

Używasz do tego pętli for..in. Upewnij się, że obiekt posiada właściwości lub wszystkie odziedziczone właściwości są pokazane. Przykład jest taki:

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

Lub jeśli potrzebujesz rekurencji, aby przejść przez wszystkie właściwości:

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);
 91
Author: Roel van Uden,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-04 07:04:47

Mój problem był w rzeczywistości problemem złego planowania z obiektem JSON, a nie faktycznym problemem logicznym. Skończyło się na tym, że uporządkowałem obiekt w następujący sposób, zgodnie z sugestią od user2736012.

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

W tym momencie udało mi się zrobić dość prostą pętlę for na podstawie całkowitej liczby obiektów.

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

Moja metoda pobierania totalMessages nie jest jednak obsługiwana we wszystkich przeglądarkach. Dla mojego projektu, to właściwie nie ma znaczenia, ale uważaj na to, jeśli zdecydujesz się użyć coś podobnego do tego.

 9
Author: Eric,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-11 17:36:10

Oto moje rekurencyjne podejście:

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;
}
 2
Author: schirrmacher,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-01 09:30:00