简体   繁体   English

JSON对象-递归更改所有子代的属性名称

[英]JSON object - changing a property name for all children recursively

I have following json object. 我有以下json对象。

myJsonObj = {  
   "name":"Laptop",
   "type":"hardware computer laptop",
   "forward":[  
      {  
         "name":"Depends On",
         "forward":[  
            {  
               "name":"test asset 1",
               "type":"hardware",
               "link":"somelink"
            }
         ]
      },
      {  
         "name":"somename",
         "forward":[  
            {  
               "name":"test asset 5",
               "type":"hardware",
               "link":"somelink"
            }
         ]
      }
   ],
   "inverse":[  
      {  
         "name":"somename",
         "inverse":[  
            {  
               "name":"test asset 4",
               "ciTypeCls":"hardware",
               "link":"somelink"
            },
            {  
               "name":"test asset 1",
               "ciTypeCls":"hardware",
               "link":"somelink"
            }
         ]
      },
      {  
         "name":"somename",
         "inverse":[  
            {  
               "name":"test asset 1",
               "ciTypeCls":"hardware",
               "link":"somelink"
            }
         ]
      }
   ]
}

I'm trying to change property name forward to children . 我试图改变属性名称forwardchildren

Following is my code 以下是我的代码

 myJsonObj = { "name": "Laptop", "type": "hardware computer laptop", "forward": [{ "name": "Depends On", "forward": [{ "name": "test asset 1", "type": "hardware", "link": "somelink" }] }, { "name": "somename", "forward": [{ "name": "test asset 5", "type": "hardware", "link": "somelink" }] }], "inverse": [{ "name": "somename", "inverse": [{ "name": "test asset 4", "ciTypeCls": "hardware", "link": "somelink" }, { "name": "test asset 1", "ciTypeCls": "hardware", "link": "somelink" }] }, { "name": "somename", "inverse": [{ "name": "test asset 1", "ciTypeCls": "hardware", "link": "somelink" }] }] } jQuery.each(myJsonObj, function(e) { e.children = e.forward; delete e.forward; }); console.log(myJsonObj); 
 <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 

It does not seem to work , What am i doing wrong ? 它似乎不起作用,我在做什么错?

Try this: 尝试这个:

 jQuery.each(myJsonObj.forward, function(i , item) {
     //Nested forward
     item.children = item.forward;
     delete item.forward;
});
   //PARENT forward
    myJsonObj.children = myJsonObj.forward;
    delete myJsonObj.forward;

JSFiddle https://jsfiddle.net/xbkp10Ly/ JSFiddle https://jsfiddle.net/xbkp10Ly/

As per your current JSON structure simple Find and Replace can work. 根据您当前的JSON结构,简单的“查找和替换”即可工作。

 var myJsonObj = { "name": "Laptop", "type": "hardware computer laptop", "forward": [{ "name": "Depends On", "forward": [{ "name": "test asset 1", "type": "hardware", "link": "somelink" }] }, { "name": "somename", "forward": [{ "name": "test asset 5", "type": "hardware", "link": "somelink" }] }], "inverse": [{ "name": "somename", "inverse": [{ "name": "test asset 4", "ciTypeCls": "hardware", "link": "somelink" }, { "name": "test asset 1", "ciTypeCls": "hardware", "link": "somelink" }] }, { "name": "somename", "inverse": [{ "name": "test asset 1", "ciTypeCls": "hardware", "link": "somelink" }] }] } document.write('<pre>' + JSON.stringify(myJsonObj).replace(/forward/g, "children") + '</pre>'); 

More secure, as it will check for Property only not for value 更安全,因为它只会检查属性而不是价值

JSON.parse(JSON.stringify(myJsonObj).replace(/forward(?=\":)/g,"children"))

Check this link 检查此链接

This is a proposal with iteration over the objects and the arrays in recursive style. 这是一个以递归样式对对象和数组进行迭代的提议。

It uses an depth-first search , because the actual node must retain until all dependent nodes are visited. 它使用深度优先搜索 ,因为实际节点必须保留,直到访问所有从属节点为止。

 var obj = { "name": "Laptop", "type": "hardware computer laptop", "forward": [{ "name": "Depends On", "forward": [{ "name": "test asset 1", "type": "hardware", "link": "somelink" }] }, { "name": "somename", "forward": [{ "name": "test asset 5", "type": "hardware", "link": "somelink" }] }], "inverse": [{ "name": "somename", "inverse": [{ "name": "test asset 4", "ciTypeCls": "hardware", "link": "somelink" }, { "name": "test asset 1", "ciTypeCls": "hardware", "link": "somelink" }] }, { "name": "somename", "inverse": [{ "name": "test asset 1", "ciTypeCls": "hardware", "link": "somelink" }] }] }; function replaceProperty(o, from, to) { function f(r, p) { if (Array.isArray(r[p])) { iterA(r[p]); } if (typeof r[p] === 'object') { iterO(r[p]); } if (p === from) { r[to] = r[from]; delete r[from]; } } function iterO(o) { Object.keys(o).forEach(function (k) { f(o, k); }); } function iterA(a) { a.forEach(function (_, i, aa) { f(aa, i); }); } iterO(o); } replaceProperty(obj, 'forward', 'children'); document.write('<pre>' + JSON.stringify(obj, 0, 4) + '</pre>'); 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM