![](/img/trans.png)
[英]Create parent-children tree-like array of objects from ordered array of strings with their relationship in JavaScript
[英]Javascript - Create tree structure from array of objects using a group by to define children
我有一个对象数组,我想从中按属性分组以构建树结构。
objects = [object1, object2, object3, ... ]
对象示例:
object1 = {
FolderName: "Folder1", //group on this property
NodeName: "Node1"
}
我想通过FolderName属性对对象进行分组,以获得如下所示的树形结构:
treeData = [
{
text: "Folder1",
nodes: [
{
text: "Node1",
}
]
},
{
text: "Folder2",
nodes : [
{
text: "NodeX",
}
]
}
]
编辑:
我正在尝试使用这个groupBy函数,但是它返回一个数组数组。 因此,我使用for循环将其转换为所需的树形结构。 我得到了想要的结果,但是我徘徊着如何以更优化的方式实现它。
function groupBy(array, f) {
var groups = {};
array.forEach(function(o){
var group = JSON.stringify(f(o));
groups[group] = groups[group] || [];
groups[group].push(o);
});
return Object.keys(groups).map(function(group){
return groups[group];
});
}
var result = groupBy(objects, function(item){
item.text = item.NodeName;
return [item.FolderName];
});
var treeData = [];
for (i=0; i < result.length; i++) {
treeData.push({ "text": result[i][0].FolderName, "nodes":result[i]});
}
尚未测试,但请尝试:
var treeData = [],
folders = {};
objects.forEach(function(obj){
if(obj.FolderName in folders)
treeData[folders[obj.FolderName]].nodes.push({text:obj.NodeName});
else
folders[obj.FolderName] = treeData.push({text: obj.FolderName, nodes: [{text:obj.NodeName}]}) - 1;
});
这个想法是在构建树数组时创建一个对象( folders
),该树数组将FolderName
作为属性存储,并将FolderName
被添加到treeData
数组中的位置的treeData
作为值。 在添加到树中时,您检查folder
对象是否具有此属性,如果有,请将节点添加到以该值存储的对象的节点数组中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.