Javascript 使用多属性对json树进行排序

Javascript 使用多属性对json树进行排序,javascript,arrays,json,Javascript,Arrays,Json,我已经用一个简单的json编写了一个json树。但是我需要用多种条件对树进行排序。 例如,在级别1,我们有多个对象。我们需要按级别排序,然后按名称属性排序 级别是数字,名称是字母数字。所以名字排序是先字母,然后数字 下面是输入json var inputJson = [ { "level": "1", "leafFlag": "1", "path":"p123", "name":"food23" }, { "level": "1", "leafFlag": "1"

我已经用一个简单的json编写了一个json树。但是我需要用多种条件对树进行排序。 例如,在级别1,我们有多个对象。我们需要按级别排序,然后按名称属性排序


级别是数字,名称是字母数字。所以名字排序是先字母,然后数字

下面是输入json

var inputJson = [
  {
  "level": "1",
  "leafFlag": "1",
  "path":"p123",
  "name":"food23"
},
  {
  "level": "1",
  "leafFlag": "1",
  "path":"r125",
  "name":"car1"
},
  {
  "level": "2",
  "leafFlag": "0",
  "path":"p123/p345",
  "name":"apple345"
},
 {
  "level": "2",
  "leafFlag": "1",
  "path":"p123/p095",
  "name":"123banana"
},
{
  "level": "3",
  "leafFlag": "0",
  "path":"p123/p095/p546",
  "name":"543"
},
{
  "level": "2",
  "leafFlag": "1",
  "path":"r125/yhes",
  "name":"tata78"
}
]

var output = [];
下面的代码准备json树

我在这里尝试使用多个属性进行排序

inputJson=inputJson.sort((a,b)=>(parseInt(a.level)>parseInt(b.level))?1:-1)
inputJson.forEach(v=>{
如果(v.level==“1”){
v、 儿童=[];
输出推力(v);
}
否则{
路径值=v.path.split(“/”);
pathValues.pop();
var节点=null;
var fullPath=“”;
forEach(p=>{
完整路径=完整路径==“”?p:fullPath+“/”+p;
node=(node==null?输出:node.children).find(o=>o.path==fullPath);
})
node.children=node.children | |[];
节点。子节点。推送(v);
}
})
来自上面的输出:

var output = [
  {
    "level": "1",
    "leafFlag": "1",
    "path": "p123",
    "name": "food23",
    "children": [
      {
        "level": "2",
        "leafFlag": "0",
        "path": "p123/p345",
        "name": "apple"
      },
      {
        "level": "2",
        "leafFlag": "1",
        "path": "p123/p095",
        "name": "banana",
        "children": [
          {
            "level": "3",
            "leafFlag": "0",
            "path": "p123/p095/p546",
            "name": "grapes"
          }
        ]
      }
    ]
  },
  {
    "level": "1",
    "leafFlag": "1",
    "path": "r125",
    "name": "car",
    "children": [
      {
        "level": "2",
        "leafFlag": "1",
        "path": "r125/yhes",
        "name": "tata",
        "children": [
          {
            "level": "3",
            "leafFlag": "0",
            "path": "r125/yhes/sdie",
            "name": "Range Rover"
          }
        ]
      },
      {
        "level": "2",
        "leafFlag": "0",
        "path": "r125/theys",
        "name": "suzuki"
      }
    ]
  }
]
预期产出:

[
  {
    "level": "1",
    "leafFlag": "1",
    "path": "r125",
    "name": "car",
    "children": [
      {
        "level": "2",
        "leafFlag": "0",
        "path": "r125/theys",
        "name": "suzuki"
      },
      {
        "level": "2",
        "leafFlag": "1",
        "path": "r125/yhes",
        "name": "tata",
        "children": [
          {
            "level": "3",
            "leafFlag": "0",
            "path": "r125/yhes/sdie",
            "name": "Range Rover"
          }
        ]
      }
    ]
  },
  {
    "level": "1",
    "leafFlag": "1",
    "path": "p123",
    "name": "food",
    "children": [
      {
        "level": "2",
        "leafFlag": "0",
        "path": "p123/p345",
        "name": "apple"
      },
      {
        "level": "2",
        "leafFlag": "1",
        "path": "p123/p095",
        "name": "banana",
        "children": [
          {
            "level": "3",
            "leafFlag": "0",
            "path": "p123/p095/p546",
            "name": "grapes"
          }
        ]
      }
    ]
  }
]
我试过下面的方法

inputJson = inputJson.sort((a, b) => (parseInt(a.level) > parseInt(b.level)) ? 1 : -1 && a.name > b.name ? 1 ? -1)

您应该首先按名称排序,然后按级别重新排序排序的数组

inputJson = inputJson.sort((a,b) => {return a.name > b.name}).sort((a,b) => {return (Number(a.level) - Number(b.level)};

您应该首先按名称排序,然后按级别重新排序排序的数组

inputJson = inputJson.sort((a,b) => {return a.name > b.name}).sort((a,b) => {return (Number(a.level) - Number(b.level)};

您可以先按级别排序,然后按名称进行单个排序

.sort((a, b) => a.level - b.level || a.name.localeCompare(b.name))
然后用已排序的项构建树

var数据=[{level:“1”,leafFlag:“1”,path:“p123”,name:“food”},{level:“1”,leafFlag:“1”,path:“r125”,name:“car”},{level:“2”,leafFlag:“1”,path:“p123/p095”,name:“banana”},{level:“3”,leafFlag:“0”,path:“p123/p095/p546”,name:“grapes”},{level:“2”,叶旗:“1”,路径:“r125/yhes”,名称:“塔塔”},
结果=数据
.sort((a,b)=>a.level-b.level | | a.name.localeCompare(b.name))
.减少((r,o)=>{
设p=o.path.split('/');
p、 pop();
让目标=p.reduce((t,i,p)=>{
var path=p.slice(0,i+1).join('/'),
temp=(t.children=t.children | |[]).find(q=>q.path==path);
if(!temp)t.children.push(temp={path});//这不是必需的
//如果所有节点都给定
返回温度;
},{儿童:r});
(target.children=target.children | |[]).push({…o});
返回r;
}, []);
控制台日志(结果)

.as console wrapper{max height:100%!important;top:0;}
您可以先按级别排序,然后按名称排序

.sort((a, b) => a.level - b.level || a.name.localeCompare(b.name))
然后用已排序的项构建树

var数据=[{level:“1”,leafFlag:“1”,path:“p123”,name:“food”},{level:“1”,leafFlag:“1”,path:“r125”,name:“car”},{level:“2”,leafFlag:“1”,path:“p123/p095”,name:“banana”},{level:“3”,leafFlag:“0”,path:“p123/p095/p546”,name:“grapes”},{level:“2”,叶旗:“1”,路径:“r125/yhes”,名称:“塔塔”},
结果=数据
.sort((a,b)=>a.level-b.level | | a.name.localeCompare(b.name))
.减少((r,o)=>{
设p=o.path.split('/');
p、 pop();
让目标=p.reduce((t,i,p)=>{
var path=p.slice(0,i+1).join('/'),
temp=(t.children=t.children | |[]).find(q=>q.path==path);
if(!temp)t.children.push(temp={path});//这不是必需的
//如果所有节点都给定
返回温度;
},{儿童:r});
(target.children=target.children | |[]).push({…o});
返回r;
}, []);
控制台日志(结果)
.as控制台包装{max height:100%!important;top:0;}
var rootes=inputJson.filter(x=>x.level=='1')
对于(i=0;ix.leafFlag=='1')
对于(i=0;i{
patharr=x.path.split(“/”)
path=patharr.pop()
开关(x级){
案例“2”:
filter(p=>{if(p.path==patharr[0]){p.children.push(x)}
}) 
打破
案例“3”:
objwithchild.filter(p=>{if(p.path==patharr[0]+'/'+patharr[1]){p.children.push(x)}
}) 
打破
}
})
dir(rootes,{depth:null})
var rootes=inputJson.filter(x=>x.level=='1')
对于(i=0;ix.leafFlag=='1')
对于(i=0;i{
patharr=x.path.split(“/”)
path=patharr.pop()
开关(x级){
案例“2”:
filter(p=>{if(p.path==patharr[0]){p.children.push(x)}
}) 
打破
案例“3”:
objwithchild.filter(p=>{if(p.path==patharr[0]+'/'+patharr[1]){p.children.push(x)}
}) 
打破
}
})
dir(rootes,{depth:null})

排序不能保证稳定,因此两次排序不一定会产生与两个标准排序相同的结果,因为第一次排序可能会丢失。级别是数字,名称是字母数字。所以名字排序是先字母,然后字母numbers@VLAZ按名称排序后,将获得按名称排序的对象数组。当您按级别对排序后的数组进行重新排序时,首先会得到按级别排序的数组,然后是按名称排序的数组。还请注意,当遇到两个具有相同排序条件(在您的示例中为级别)的对象时,它们的顺序不会更改,如中所述documentation@WaisKamal从文档“If
compareFunction(a,b)”中
返回0,使a和b彼此保持不变,但按respec排序