【问题标题】:JSON to Tree JSJSON 到树 JS
【发布时间】:2017-02-09 10:57:47
【问题描述】:

谁能帮我改一下这个json:

这些是规则: JSON (A) 的节点不按特定顺序排序 JSON (A) 的节点是可变的 当没有附加子节点时,“从属”节点必须不存在(参见 markcorderoi 或 richard) 状态表示就业状态,1=工作,2=结束。连接到 end(2) 节点的所有工作节点都应该使用相邻的(上行链路)工作(1)节点(即连接到 nssi 的 marcoderoi,在最终树中删除 rudy) JSON (B) 不应包含结束节点

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
  }
]

这个?

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"
   }
]

我真的很难只使用 Javascript 来做一些算法。

【问题讨论】:

标签: javascript json tree


【解决方案1】:

这有点棘手,因为您的数据不包含没有父节点的项目,因此收集所有子节点和所有父节点。只有父母是结果集没有孩子的用途。

ended 中,所有status === 2 节点都被收集并在以后删除,如果这些节点作为父节点工作。

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; }

【讨论】:

  • 感谢妮娜的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-06
  • 1970-01-01
  • 2014-04-05
  • 2016-08-16
  • 2015-03-30
相关资源
最近更新 更多