从类似json的复杂结构中获取最后一个子节点,并仅在javascript中重构最后一个节点



我需要更改由对象和数组组成的类似json的复杂结构的结构。假设原始对象是dataObj

const dataObj = {
name: "flare",
children: [
{
name: "analytics",
desc : "A",
children: [
{
name: "cluster",
desc : "AB",
children: [
{ 
name: "AgglomerativeCluster",
desc : "ABC",
value: 3938,
count:39 
}, 
{ 
name: "CommunityStructure",
desc : "ABCD", 
value: 3812,
count:38
},
]
},
{
name: "graph",
desc : "ABCDE",
children: [
{ 
name: "BetweennessCentrality",
desc : "AHF", 
value: 3534,
count:39
},
{ 
name: "LinkDistance",
desc : "AmH", 
value: 5731,
count:39 
},
]
},
{
name: "optimization",
desc : "Ashg",
children: [
{ 
name: "AspectRatioBanker",
desc : "Avnvs", 
value: 7074,
count:39 
}
]
}
]
},
{
name: "animate",
desc : "Amvs",
children: [
{ 
name: "Easing",
desc : "Amnvs", 
value: 17010,
count:39 
},
{ 
name: "FunctionSequence",
desc : "Abnvs", 
value: 5842 ,
count:39
},
]
},
]
};

我需要得到最后一个子节点,它由键"value"one_answers"count"组成例如:

children: [
{ 
name: "AgglomerativeCluster",
desc : "ABC",
value: 3938,
count:39 
}, 
{ 
name: "CommunityStructure",
desc : "ABCD", 
value: 3812,
count:38
},
]

这是最后一个带有键"value"one_answers"count"的叶节点,我需要对其进行重组,并使子节点采用这种格式

children: [
{ 
name: "AgglomerativeCluster",
desc : "ABC",
children : [
{
name: "AgglomerativeCluster",
desc : "ABC",
value: 3938,
count:39                   
}
]
}, 
{ 
name: "CommunityStructure",
desc : "ABCD",
children : [
{
name: "CommunityStructure",
desc : "ABCD",
value: 3812,
count:38                  
}
] 
},
]

正如您再次看到的,这个子节点应该有一个children键,我需要在其中传递具有相同"name"one_answers"desc"键的值和计数键。我搞不懂逻辑,它看起来超级复杂,有人能解决这个问题吗?

预期结果:

const result = {
name: "flare",
children: [
{
name: "analytics",
desc : "A",
children: [
{
name: "cluster",
desc : "AB",
children: [
{ 
name: "AgglomerativeCluster",
desc : "ABC",
children : [
{
name: "AgglomerativeCluster",
desc : "ABC",
value: 3938,
count:39                   
}
]
}, 
{ 
name: "CommunityStructure",
desc : "ABCD",
children : [
{
name: "CommunityStructure",
desc : "ABCD",
value: 3812,
count:38                  
}
] 
},
]
},
{
name: "graph",
desc : "ABCDE",
children: [
{ 
name: "BetweennessCentrality",
desc : "AHF",
children : [
{
name: "BetweennessCentrality",
desc : "AHF",
value: 3534,
count:39
}
] 
},
{ 
name: "LinkDistance",
desc : "AmH",
children : [
{
name: "LinkDistance",
desc : "AmH",
value: 5731,
count:39 
}
] 
},
]
},
{
name: "optimization",
desc : "Ashg",
children: [
{ 
name: "AspectRatioBanker",
desc : "Avnvs",
children : [
{
name: "AspectRatioBanker",
desc : "Avnvs",
value: 7074,
count:39 
}
] 
}
]
}
]
},
{
name: "animate",
desc : "Amvs",
children: [
{ 
name: "Easing",
desc : "Amnvs",
children : [
{
name: "Easing",
desc : "Amnvs",
value: 17010,
count:39 
}
] 
},
{ 
name: "FunctionSequence",
desc : "Abnvs",
children : [
{
name: "FunctionSequence",
desc : "Abnvs",
value: 5842 ,
count:39
}
] 
},
]
},
]
};

您可以重构最后一个对象。

function restructure(object) {
return object.children
? Object.assign({}, object, { children: object.children.map(restructure) })
: { name: object.name, desc: object.desc, children: [object] };
}
var data = { name: "flare", children: [{ name: "analytics", desc: "A", children: [{ name: "cluster", desc: "AB", children: [{ name: "AgglomerativeCluster", desc: "ABC", value: 3938, count: 39 }, { name: "CommunityStructure", desc: "ABCD", value: 3812, count: 38 }] }, { name: "graph", desc: "ABCDE", children: [{ name: "BetweennessCentrality", desc: "AHF", value: 3534, count: 39 }, { name: "LinkDistance", desc: "AmH", value: 5731, count: 39 }] }, { name: "optimization", desc: "Ashg", children: [{ name: "AspectRatioBanker", desc: "Avnvs", value: 7074, count: 39 }] }] }, { name: "animate", desc: "Amvs", children: [{ name: "Easing", desc: "Amnvs", value: 17010, count: 39 }, { name: "FunctionSequence", desc: "Abnvs", value: 5842, count: 39 }] }] },
result = restructure(data);
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

您可以使用递归函数来完成此操作,该函数将传递子数组中元素的索引以及父数组,因此您可以使用splice方法。

const dataObj = {"name":"flare","children":[{"name":"analytics","desc":"A","children":[{"name":"cluster","desc":"AB","children":[{"name":"AgglomerativeCluster","desc":"ABC","value":3938,"count":39},{"name":"CommunityStructure","desc":"ABCD","value":3812,"count":38}]},{"name":"graph","desc":"ABCDE","children":[{"name":"BetweennessCentrality","desc":"AHF","value":3534,"count":39},{"name":"LinkDistance","desc":"AmH","value":5731,"count":39}]},{"name":"optimization","desc":"Ashg","children":[{"name":"AspectRatioBanker","desc":"Avnvs","value":7074,"count":39}]}]},{"name":"animate","desc":"Amvs","children":[{"name":"Easing","desc":"Amnvs","value":17010,"count":39},{"name":"FunctionSequence","desc":"Abnvs","value":5842,"count":39}]}]}
function update(data, index = null, parent = null,) {
if(data.children) {
data.children.forEach((c, i) => {
update(c, i, data.children)
})
}
else {
const {name, desc} = data;
const object = {name, desc, children: [{...data}]}
parent.splice(index, 1, object)
}
}
update(dataObj);
console.log(dataObj)

最新更新