Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/456.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何对具有子属性的对象进行排序?_Javascript - Fatal编程技术网

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;ilog(输出)
我使用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']
(它们在列表表示中的顺序)。不幸的是,这是一个错误的答案。谢谢你的努力!我看错了,我会再试一次(顺便说一句,我的订单很好,但不是我得到它的方式)谢谢!这看起来很有希望。我会试试的。谢谢你的回答!我一定也会试试这个。谢谢你发这个帖子!我一定会试试看。