javascript - JSON 到 Tree JS

标签 javascript json tree

谁能帮我修改这个 json:

规则如下: JSON (A) 的节点无特定顺序排序 JSON (A) 的节点是可变的 当没有附加子节点时,“从属”节点不得存在(参见 markcorderoi 或 richard) status表示雇佣状态,1=working,2=ended。所有连接到 ended(2) 节点的工作节点应该使用相邻的(上行链路)working(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 来做一些算法。

最佳答案

这有点棘手,因为你的数据不包含没有父节点的项目,所以收集了所有子节点和所有父节点。对于结果集,只有 parent 是没有 child 的用途。

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

关于javascript - JSON 到 Tree JS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42134847/

相关文章:

python - 从带有子项的字典数组构建嵌套的树状字典

java - 在 Java 中查找与给定子树匹配的树中的所有子树

javascript - cubism.js 中的 serverDelay 是做什么的?

javascript - 值未保存在 orientdb 类中

Python - 根据 JSON 中的值从 JSON 中删除重复元素

php - WordPress:如何从 Json 中的 wordpress 函数获取响应?

ios - 组织地理引用数据的最佳方式是什么?

javascript - 如何将图像保存到单独的文件夹中

javascript - 从 html 中的 <script> 调用 CoffeeScript 定义的函数?

javascript - 从 Action 类将 json 返回到 ajax