谁能帮我修改这个 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/