2

Can someone please help me change this json:

These are the rules: The nodes of JSON (A) is sorted in no particular order The nodes of JSON (A) is mutable The "subordinate" node must not exist when there is no attached child to it (see markcorderoi or richard) The status indicates employment status, 1=working, 2=ended. All working nodes attached to ended(2) nodes should use the adjacent (uplink) working(1) nodes (ie marcoderoi attached to nssi, removing rudy in the final tree) JSON (B) should not contain ended nodes

JSON A:

[
  {
    "manager_name": "nssi",
    "login_name": "nishanthi",
    "status": 2
  }, 
  {
      "manager_name": "mbarcelona",
      "login_name": "nssi",
      "status": 1
  }, 
  {
      "manager_name": "nishanthi",
      "login_name": "markcorderoi",
      "status": 1
  }, 
  {
      "manager_name": "mbarcelona",
      "login_name": "richard",
      "status": 1
  }, 
  {
      "manager_name": "letecia",
      "login_name": "kamran",
      "status": 1
  }, 
  {
      "manager_name": "letecia",
      "login_name": "rudy",
      "status": 2
  }, 
  {
      "manager_name": "rudy",
      "login_name": "sol",
      "status": 2
  }, 
  {
    "manager_name": "gloria",
    "login_name": "maria",
    "status": 1
  }, 
  {
    "manager_name": "markcorderoi",
    "login_name": "gloria",
    "status": 1
  }
]

to this?

JSON B:

[  
   {  
      "subordinate":[  
         {  
            "subordinate":[  
               {  
                  "subordinate":[  
                     {  
                        "subordinate":[  
                           {  
                              "name":"maria"
                           }
                        ],
                        "name":"gloria"
                     }
                  ],
                  "name":"markcorderoi"
               }
            ],
            "name":"nssi"
         },
         {  
            "name":"richard"
         }
      ],
      "name":"mbarcelona"
   },
   {  
      "subordinate":[  
         {  
            "name":"kamran"
         },
         {  
            "name":"sol"
         }
      ],
      "name":"letecia"
   }
]

I am having really a hard time doing some algorithms using only Javascript.

Ashish Bahl
  • 1,482
  • 1
  • 18
  • 27
  • Possible duplicate of http://stackoverflow.com/q/18017869/6647153! – ibrahim mahrir Feb 09 '17 at 11:31
  • Possible duplicate of [Build tree array from flat array in javascript](http://stackoverflow.com/questions/18017869/build-tree-array-from-flat-array-in-javascript) – sampathsris Feb 09 '17 at 12:53
  • Yeah, I tried that link but still I can't make it correct. Please help. –  Feb 09 '17 at 13:55
  • I tried so many approach, and then I was stucked with this –  Feb 09 '17 at 13:58
  • success : function( data ) { var node = {}; var map = {}; var roots = []; for ( var i = 0; i < data.length; i++ ) { if ( data[i].status !== 2 ) { map[ node.name ] = i; node.name = data[ map[ node.name ] ].manager_name; if ( data[i].hasOwnProperty( 'login_name' ) ) { console.log( data[i].manager_name ); } } } //console.log( roots ) ; console.log( data ); } –  Feb 09 '17 at 13:58

1 Answers1

1

It's a bit tricky, because your data does not contain items with no parent, so all children are collected and all parent nodes. Only the parents are uses which have been no children for the result set.

In ended, all status === 2 nodes are collected and later deleted, if the nodes works as parent.

function getTree(data) {
    var o = {},
        children = {},
        parents = {},
        ended = [];

    data.forEach(function (a) {
        var temp = { name: a.login_name };

        children[a.login_name] = true;
        parents[a.manager_name] = true;
        if (a.status === 2) {
            ended.push(a);
        }
        if (o[a.login_name] && o[a.login_name].subordinate) {
            temp.subordinate = o[a.login_name].subordinate;
        }
        o[a.login_name] = temp;
        o[a.manager_name] = o[a.manager_name] || { name: a.manager_name };
        o[a.manager_name].subordinate = o[a.manager_name].subordinate || [];
        o[a.manager_name].subordinate.push(temp);
    });

    ended.forEach(function (a) {
        var index = -1;
        if (o[a.login_name].subordinate) {
            o[a.manager_name].subordinate.some(function (b, i) {
                if (b === o[a.login_name]) {
                    index = i;
                    return true;
                }
            });
            if (index !== -1) {
                o[a.manager_name].subordinate.splice(index, 1);
                o[a.manager_name].subordinate = o[a.manager_name].subordinate.concat(o[a.login_name].subordinate);
            }
        }
    });

    Object.keys(children).forEach(function (k) {
        delete parents[k];
    });

    return Object.keys(parents).map(function (k) {
        return o[k];
    });
}

var data = [{ manager_name: "nssi", login_name: "nishanthi", status: 2 }, { manager_name: "mbarcelona", login_name: "nssi", status: 1 }, { manager_name: "nishanthi", login_name: "markcorderoi", status: 1 }, { manager_name: "mbarcelona", login_name: "richard", status: 1 }, { manager_name: "letecia", login_name: "kamran", status: 1 }, { manager_name: "letecia", login_name: "rudy", status: 2 }, { manager_name: "rudy", login_name: "sol", status: 2 }, { manager_name: "gloria", login_name: "maria", status: 1 }, { manager_name: "markcorderoi", login_name: "gloria", status: 1 }];

console.log(getTree(data));
.as-console-wrapper { max-height: 100% !important; top: 0; }
Nina Scholz
  • 376,160
  • 25
  • 347
  • 392