Javascript 如何对具有子属性的对象进行排序?
我有一个表示树的对象:Javascript 如何对具有子属性的对象进行排序?,javascript,Javascript,我有一个表示树的对象: const obj = { "1": { id: "1", children: ["1-1", "1-2"] }, "1-1": { id: "1-1", children: ["1-1-1", "1-1-2"] }, "1-2": {
const obj = {
"1": {
id: "1",
children: ["1-1", "1-2"]
},
"1-1": {
id: "1-1",
children: ["1-1-1", "1-1-2"]
},
"1-2": {
id: "1-2",
children: []
},
"1-1-1": {
id: "1-1-1",
children: []
},
"1-1-2": {
id: "1-1-2",
children: []
}
};
结果是一个类似于以下内容的列表:
-
1.
-
1.1
- 1.1.1
- 1.1.2
-
1.2
const obj={1:{id:“1”,children:[“1-1”,“1-2”],“1-1”:{id:“1-1-1”,“1-1-2”],“1-2”:{id:“1-2”,children:[]},“1-1-1”:{id:“1-1-1”,children:[]},“1-1-2”:{id:“1-1-1-2”,children;
常量输出=对象键(obj)
//删除所有非根
Object.entries(obj).forEach(el=>el[1].children.forEach(child=>{
让index=output.indexOf(子项)
如果(索引!=-1){
接头输出(索引,1)
}
}))
for(设i=0;i log(输出)
我使用DFS进行解析。它可以对任何深度数据进行排序。(您可以尝试obj2)
const obj={
"1": {
id:“1”,
儿童:[“1-1”、“1-2”]
},
"1-1": {
id:“1-1”,
儿童:[“1-1-1”、“1-1-2”]
},
"1-2": {
id:“1-2”,
儿童:[]
},
"1-1-1": {
id:“1-1-1”,
儿童:[]
},
"1-1-2": {
id:“1-1-2”,
儿童:[]
}
};
常数obj2={
"2": {
id:“2”,
儿童:[“2-1”、“2-2”、“2-3”]
},
"2-1": {
id:“2-1”,
儿童:[“2-1-1”、“2-1-2”]
},
"2-2": {
id:“2-2”,
儿童:[]
},
"2-3": {
id:“2-3”,
儿童:[]
},
"2-1-1": {
id:“2-1-1”,
儿童:[“2-1-1-1”、“2-1-1-2”]
},
"2-1-2": {
id:“2-1-2”,
儿童:[“2-1-2-1”]
},
"2-1-1-1": {
id:“2-1-1-1”,
儿童:[]
},
"2-1-1-2": {
id:“2-1-1-2”,
儿童:[]
},
"2-1-2-1": {
id:“2-1-2-1”,
儿童:[]
},
};
/*DFS*/
函数排序(id){
如果(!已排序。包括(id)){
排序推送(id);
obj[id].children.forEach(sub=>{
分类(分);
});
}
}
/*主要*/
设排序=[];
for(让Object.entries(obj))的[id,value]{
排序(id);
}
console.log(sorted.flat())代码>您可以尝试使用基本条件进行递归调用,以忽略遍历的节点
const obj={
"1": {
id:“1”,
儿童:[“1-1”、“1-2”],
},
"1-1": {
id:“1-1”,
儿童:[“1-1-1”、“1-1-2”],
},
"1-2": {
id:“1-2”,
儿童:[],
},
"1-1-1": {
id:“1-1-1”,
儿童:[],
},
"1-1-2": {
id:“1-1-2”,
儿童:[],
},
}
函数遍历(obj){
常数res=[]
遍历常量={}
函数getChildren(id){
if(遍历[id]){
返回
}
资源推送(id)
遍历[id]=真
obj[id].children.forEach((childId)=>getChildren(childId))
}
for(对象中的常量id){
getChildren(id)
}
返回res
}
log(遍历(obj))
希望这是您所期望的
let ans = []
function recursiveCallObj(key){
!ans.includes(key) ? ans.push(key) : ""
for(let i=0; i< obj[key].children.length; i++){
if(!ans.includes(obj[key].children[i])){
recursiveCallObj(obj[key].children[i])
}
else{
return
}
}
}
for(let [key, value] of Object.entries(obj)){
if(value.children.length > 0){
recursiveCallObj(key)
}
else{
!ans.includes(key) ? ans.push(key) : ""
}
}
console.log(ans)
让ans=[]
函数递归callobj(键){
!ans.includes(键)?ans.push(键):“”
for(设i=0;i0){
递归callobj(键)
}
否则{
!ans.includes(键)?ans.push(键):“”
}
}
控制台日志(ans)
你能告诉我们你试过什么吗?@jonatjano,呃,有一千种不同的失效递归函数返回未定义错误或控制台错误。不确定这是否有帮助。这是obj变量中的宽度优先或级别顺序遍历。你可以把它保存到树上。从那时起,以任何其他方式打印都很容易。给出最接近的坏版本,让我们向您展示您没有想到的内容,让您从错误中学习,而不仅仅是获得有效的代码片段。您期望的输出不清楚。是否只希望输出中的子项或输出数组中应存在ID?结果应为['1','1-1','1-1-1','1-1-2','1-2']
(它们在列表表示中的顺序)。不幸的是,这是一个错误的答案。谢谢你的努力!我看错了,我会再试一次(顺便说一句,我的订单很好,但不是我得到它的方式)谢谢!这看起来很有希望。我会试试的。谢谢你的回答!我一定也会试试这个。谢谢你发这个帖子!我一定会试试看。