Я столкнулся с некоторыми проблемами в отношении моего проекта, где я пытаюсь построить дерево, используя данные JSON. У меня есть что-то вроде этого
var treeData = [
{
"name": "Root Node",
"parent": "null",
"children": [
{
"name": " Transport",
"parent": "Root Node",
"nodeId":"nod411",
"children": [
{
"name": "Cars",
"parent": "Transport",
"nodeId":"nodjz13l"
},
{
"name": "Transport-2",
"parent": "Transport",
"nodeId":"nod411",
"children": [
{
"name": "Cars",
"parent": "Transport-2",
"nodeId":"nod1_cdot"
},
{
"name": "Cars",
"parent": "Transport-2",
"nodeId":"nod45jkl"
},
{
"name": "Bikes",
"parent": "Transport-2",
"nodeId":"nod411"
},
{
"name": "Cars",
"parent": "Transport-2",
"nodeId":"nod961"
},
{
"name": "Cars",
"parent": "Transport-2",
"nodeId":"nodm2m40"
},
{
"name": "Bikes",
"parent": "Transport-2",
"nodeId":"nod411"
},
]
},
{
"name": "Cars",
"parent": "Transport",
"nodeId":"nod411"
},
{
"name": "Cars",
"parent": "Transport",
"nodeId":"nod311"
},
{
"name": "Bikes",
"parent": "Transport",
"nodeId":"nod411"
},
]
},
{
"name": "Bikes",
"parent": "Root Node",
"nodeId":"nod411"
}
]
}
];
где я хочу группировать аналогичные записи, основываясь на его значении как пары ключ-значение, что-то вроде этого.
var treeData = [
{
"name": "Root Node",
"parent": "null",
"children": [
{
"name": " Transport",
"parent": "Root Node",
"nodeId":"nod411",
"children": [
{"key":"car","values":[
{
"name": "Cars",
"parent": "Transport",
"nodeId":"nodjz13l"
},
{
"name": "Cars",
"parent": "Transport",
"nodeId":"nod411"
},
{
"name": "Cars",
"parent": "Transport",
"nodeId":"nod311"
}
]
},
{
"name": "Transport-2",
"parent": "Transport",
"nodeId":"nod411",
"children": [
{"key":"car","values":[
{
"name": "Cars",
"parent": "Transport-2",
"nodeId":"nod1_cdot"
},
{
"name": "Cars",
"parent": "Transport-2",
"nodeId":"nod45jkl"
},
{
"name": "Cars",
"parent": "Transport-2",
"nodeId":"nod961"
},
{
"name": "Cars",
"parent": "Transport-2",
"nodeId":"nodm2m40"
}
]
},
{"key":"Bikes","values":[
{
"name": "Bikes",
"parent": "Transport-2",
"nodeId":"nod411"
},
{
"name": "Bikes",
"parent": "Transport-2",
"nodeId":"nod411"
}
]
}
]
},
{"key":"Bikes","values":[
{
"name": "Bikes",
"parent": "Transport",
"nodeId":"nod411"
}
]
}
]
},
{
"name": "Bikes",
"parent": "Root Node",
"nodeId":"nod411"
}
]
}
];
Я хочу группировать данные на каждом уровне дерева.
Я пробовал вложенность с помощью d3 как
var treeDataByName = d3.nest()
.key(function(d) { return d.name; })
.entries(treeData);
console.log(JSON.stringify(treeDataByName));
Однако он преобразует только корневой узел в пару значений ключа.
Любые предложения будут полезны. Спасибо
Вы можете группировать каждый массив по желаемому ключу с помощью итеративного (для фактического массива) и рекурсивного (с детьми) подхода.
function groupBy(array, key) {
return array.reduce((r, o) => {
var temp = r.find(g => g.key === o[key]),
value = Object.assign({}, o, o.children && { children: groupBy(o.children, key) });
if (temp) {
temp.values.push(value);
} else {
r.push({ key: o[key], values: [value] });
}
return r;
}, []);
}
var tree = [{ name: "Root Node", parent: "null", children: [{ name: " Transport", parent: "Root Node", nodeId: "nod411", children: [{ name: "Cars", parent: "Transport", nodeId: "nodjz13l" }, { name: "Transport-2", parent: "Transport", nodeId: "nod411", children: [{ name: "Cars", parent: "Transport-2", nodeId: "nod1_cdot" }, { name: "Cars", parent: "Transport-2", nodeId: "nod45jkl" }, { name: "Bikes", parent: "Transport-2", nodeId: "nod411" }, { name: "Cars", parent: "Transport-2", nodeId: "nod961" }, { name: "Cars", parent: "Transport-2", nodeId: "nodm2m40" }, { name: "Bikes", parent: "Transport-2", nodeId: "nod411" }] }, { name: "Cars", parent: "Transport", nodeId: "nod411" }, { name: "Cars", parent: "Transport", nodeId: "nod311" }, { name: "Bikes", parent: "Transport", nodeId: "nod411" }] }, { name: "Bikes", parent: "Root Node", nodeId: "nod411" }] }],
result = groupBy(tree, 'name');
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }