2012-12-03 17 views
9

Czekam na skrótowy sposób użycia wartości ze słownika jako wewnętrznego odniesienia w słowniku. kod pokazuje, co mam na myśli:Wewnętrzne deklaracje referencji JSON

var dict = { 
    'entrance':{ 
     'rate1': 5, 
     'rate2':10, 
     'rate3':20, 
    }, 

    'movies':{ 
     'theDarkKnight':{ 
      '00:00':<entrance.rate1>, 
      '18:00':<entrance.rate2>, 
      '21:00':<entrance.rate3> 
     }, 
     ... 
    }; 

jest jakiś podstępny sposób, aby to zrobić?

+3

Niestety, JSON nie obsługuje rekursji/self-odniesienie. –

+0

To nie jest JSON. Pytasz o samoodniesienia podczas tworzenia obiektu za pomocą literalnej składni? Czy mówisz, że chcesz, aby określone wartości aktualizowały się automatycznie wraz ze zmianami w przywoływanych wartościach? Ponieważ nie jest to JSON, możesz użyć funkcji lub właściwości pobierających, aby uzyskać aktualne wartości innych właściwości. –

+0

@AlvinWong: "JSON" -> "JavaScript Object Notation", czyli: JSON = JavaScript. – Cerbrus

Odpowiedz

9

nr Najlepiej można to zrobić:

var dict = { 
    'entrance' : { 
     'rate1' : 5, 
     'rate2' : 10, 
     'rate3' : 20, 
    } 
}; 
dict.movies = { 
    'theDarkKnight' : { 
     '00:00' : dict.entrance.rate1, 
     '18:00' : dict.entrance.rate2, 
     '21:00' : dict.entrance.rate3 
    }, 
    ... 
}; 
3

Można użyć mustache i zdefiniować json jako „wąsami szablonu”, a następnie uruchomić wąsy do renderowania szablonu. Weź pod uwagę, że musisz uruchomić (n) razy, jeśli masz zagnieżdżone zależności. W tym przypadku masz 3 zależności: ABC --> AB --> A.

var mustache = require('mustache'); 

var obj = { 
    A : 'A', 
    AB : '{{A}}' + 'B', 
    ABC : '{{AB}}' + 'C' 
} 

function render(stringTemplate){ 
    while(thereAreStillMustacheTags(stringTemplate)){ 
    stringTemplate = mustache.render(stringTemplate, JSON.parse(stringTemplate)); 
    } 
    return stringTemplate; 
} 

function thereAreStillMustacheTags(stringTemplate){ 
    if(stringTemplate.indexOf('{{')!=-1) 
    return true; 
    return false; 
} 

console.log(render(JSON.stringify(obj))); 

a wyjście jest:

{"A":"A","AB":"AB","ABC":"ABC"}