2016-06-12 3 views
0

У меня есть объект JSONКак запустить JSon абсолютный путь в функции

stateObj:{ 
    template: { 
       cache:false, 
       ref :"templates/pages/menu", 
       searchability: true, 
       path: "content.AdminFichiers.aPropos.administrateurs", 
       lastUpdate: "Dernières mises à jour" 
      } 
} 

Я называю это, как этот

updatedata (stateObj.template.path); 

функцию для обновления контейнера выглядит следующим образом

function updatedata (dataObj){ 
     var final = "stateObj", 
      nameSplit = dataObj.split("."), 
      uls = document.createElement("ul"); 

     for(i in nameSplit) { 
      final += '["' + nameSplit[i] +'"]' 
     } 
     console.log(final); 
     for(var i in final){ 
      console.log(stateObj["content"]["AdminFichiers"]["aPropos"]["administrateurs"]);//this shows me the object 
      console.log(final);//this shows me stateObj["content"]["AdminFichiers"]["aPropos"]["administrateurs"] but i want the object 
      uls.innerHTML += "<li class='col-3 inline-block card aliceblue fadeIn'><div>Prenom: "+final[i]["prenom"]+"</div><div>Nom: "+final[i]["nom"]+"</div><div>Tel: "+final[i]["tel"]+"</div><div>Mail: "+final[i]["mail"]+"</div><div> Localisation: "+i+"</div></li>" 
     } 
     contentElement.appendChild(uls) 
    } 

здесь console.log (окончательный);

stateObj["content"]["AdminFichiers"]["aPropos"]["administrateurs"] 

и вот что я получаю в конце

enter image description here

почему я получаю Undefine везде?

Когда я сделать

for(var i in final){console.log(stateObj["content"]["AdminFichiers"]["aPropos"]["administrate‌​urs"]); } 

это показать мне результат как объект.

, как я могу запустить

stateObj["content"]["AdminFichiers"]["aPropos"]["administrateurs"]

на объекте

+0

Чтобы извлечь из строки вы построили, вы должны использовать 'Eval()', но есть * много * более эффективные способы. Кроме того, не используйте 'for-in' в массиве в JS. Это чревато опасностью. Используйте цикл 'for'. –

ответ

2

EDIT: После reprashing вопрос вы сделали это гораздо яснее. Вам нужен способ конвертировать строку "a[x][y][z]" в фактический Object, указанный ею.

Использование Eval не рекомендуется, что вы можете сделать, это:

  • начало от объекта Q = a
  • затем перейти к следующему ключу, Q = Q[x] (так что теперь на самом деле Q == a[x])
  • затем к следующему Q = Q[y] (Q == a[x][y])
  • и так далее, пока не дойдете до последнего ключа, z (Q == a[x][y][z])

Код:

function updatedata (dataObj){ 
    var nameSplit = dataObj.split("."), 
     uls = document.createElement("ul"); 

    // Start from the root object, follow each given key 
    var final = stateObj; 
    for(var i = 0; i < nameSplit.length; ++i) { 
    var key = nameSplit[i]; 
    final = final[key]; 
    } 

    for(var i in final){ 
     // This next part is wrong, your final Array is an one dimensional String array 
     // Accessing anything in the form of final[i][X] will not yield the result you are looking for 
     // What are you trying to output? 
     uls.innerHTML += "<li class='col-3 inline-block card aliceblue fadeIn'><div>Prenom: "+final[i]["prenom"]+"</div><div>Nom: "+final[i]["nom"]+"</div><div>Tel: "+final[i]["tel"]+"</div><div>Mail: "+final[i]["mail"]+"</div><div> Localisation: "+i+"</div></li>" 
    } 
    contentElement.appendChild(uls) 
} 
1

Сво происходит потому, что, когда вы разделяете nameSplit в течение в цикле, каждая буква приходит каждую строку. Итак, просто используйте функцию toString(), чтобы ваша функция работала.

Используйте этот код:

function updatedata (dataObj){ 
    var final = "stateObj", 
     nameSplit = dataObj.split("."), 
     uls = document.createElement("ul"); 

    classList(uls).add("row", "text-center"); 

    for(i in nameSplit) { 
     final += ' ["' + nameSplit[i] +'"]' 
    } 
    final = final.toString().split(" "); 
    console.log(final); 
    for(var i in nameSplit){ 
     uls.innerHTML += "<li class='col-3 inline-block card aliceblue fadeIn'><div>Prenom: "+final[i]["prenom"]+"</div><div>Nom: "+final[i]["nom"]+"</div><div>Tel: "+final[i]["tel"]+"</div><div>Mail: "+final[i]["mail"]+"</div><div> Localisation: "+i+"</div></li>" 
    } 
    contentElement.appendChild(uls) 
} 

Надеется, что это работает для вас :)

Вот jsFiddle

+1

'toString()' не требуется. Переменная 'final' уже является' String'. – Cristy

+0

@ Cristy, Thinker Но когда я делаю для (var i в финале) {console.log (stateObj ["content"] ["AdminFichiers"] ["aPropos"] ["admin urs"]); } он покажет мне результат как объект. пожалуйста, проверьте обновления –

+0

@Tambo. Я думаю, что теперь я понимаю вашу проблему, см. мое редактирование. – Cristy

1

Потому что вы пытаетесь получить доступ к свойствам объекта, где его нет. Ваш final [i] вернет символ в «i-й позиции» из последней строки, которую вы напечатали выше. final [i] вернет символ, а не объект. Таким образом, нет никакого способа, вы будете в конечном итоге со значением от чего-то вроде конечного [I] [ «Prénom»]

Смежные вопросы