2016-06-12 16 views
0

我有一个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) 
    } 
运行JSON绝对路径

这里是console.log(final);

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

,这里是我所得到的末

enter image description here

为什么会出现取消定义无处不在?

当我做

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

它告诉我的结果作为对象。

我怎样才能在运行对象

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

+0

要你建立一个字符串取,你需要使用'的eval()',但也有很多* *更好的方法。另外,不要在JS中的数组中使用'for-in'。它充满了危险。使用'for'循环。 – 2016-06-12 13:54:46

回答

2

编辑值“prenom”]结束: reprashing你来了更清晰的问题后。您想要一种方法将字符串"a[x][y][z]"转换为它指向的实际Object

使用eval不推荐,你可以做的是:

  • 从Object开始Q = a
  • 然后进入下一个键,Q = Q[x](所以现在实际上Q == a[x]
  • 然后到下一个Q = Q[y]Q == a[x][y]
  • 依此类推,直至到达最后一个关键,zQ == 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 for-in循环,每个字母就是每一个字符串。因此,只需使用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我在最后){console.log(stateObj [“content”] [“AdminFichiers”] [“aPropos”] [“administrate urs”]); }它将结果显示为对象。请更新 –

+0

@Tambo我想我现在明白你的问题,看看我的编辑。 – Cristy

1

因为你想访问那里是没有一个对象的属性。你的final [i]将从上面打印的最终字符串中返回'i'位置的字符。 final [i]将返回一个字符,而不是一个对象。因此,有没有办法,你将与来自像最终的[I]