Sooraj
Sooraj

Reputation: 10577

JSON object - changing a property name for all children recursively

I have following json object.

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.

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 ?

Upvotes: 0

Views: 123

Answers (3)

Nina Scholz
Nina Scholz

Reputation: 386746

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

Upvotes: 0

Harpreet Singh
Harpreet Singh

Reputation: 2671

As per your current JSON structure simple Find and Replace can work.

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

Upvotes: 0

pratikpawar
pratikpawar

Reputation: 2098

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/

Upvotes: 1

Related Questions