用Javascript对分层数据进行排序(邻接列表/平面表)

用Javascript对分层数据进行排序(邻接列表/平面表),javascript,hierarchical-data,Javascript,Hierarchical Data,我正在尝试对以下数据进行排序: var data = [ { path: '/a', order: 0 }, { path: '/b', order: 1 }, { path: '/a/d', order: 1 }, { path: '/a/c', order: 0 } ]; 进入: 我发现了一篇关于分层数据的好文章: 从这个问题来看,我认为我使用的是一张平桌: 对邻接列表的一种修改,在每条记录中增加一个级别和等级(如排序)列 这个问题中的链接已断开,因此我无

我正在尝试对以下数据进行排序:

var data = [
    { path: '/a', order: 0 },
    { path: '/b', order: 1 },
    { path: '/a/d', order: 1 },
    { path: '/a/c', order: 0 }
];
进入:

我发现了一篇关于分层数据的好文章:

从这个问题来看,我认为我使用的是一张平桌:

对邻接列表的一种修改,在每条记录中增加一个级别和等级(如排序)列

这个问题中的链接已断开,因此我无法从中获得更多信息

我设置了一个JSFIDLE来断言我的排序函数:

我已经尝试了几种方法,但没有一种给出正确的结果

一个完全不同的解决方案是添加顺序并按字母顺序排序。但是,由于结果将最终成为URL,因此拥有www.example.com/01-products/01-snowboard有点难看

更新

我创建了一个更复杂的JSFIDLE示例来说明我正在尝试做什么:


所以我尝试按路径排序,但节点应该按其级别的顺序排序。所以就像一个文件系统,当你按字母顺序排序时,最后一个孩子是按顺序排序的。

你能对它做一个简单的排序吗?我不完全理解你在最后一段中的担忧

var result = data.sort(function (a, b) {
  return a.path > b.path;
});


编辑。我将您的测试更改为显示顺序>abc。工作于


你能对它做个简单的分类吗?我不完全理解你在最后一段中的担忧

var result = data.sort(function (a, b) {
  return a.path > b.path;
});


编辑。我将您的测试更改为显示顺序>abc。工作于

var数据=[
{路径:'/a',顺序:0},
{路径:'/b',顺序:1},
{路径:'/a/d',顺序:1},
{路径:'/a/c',顺序:0}
];
数据排序(函数(a,b){
如果(a.path==b.path){
返回a.订单
var数据=[
{路径:'/a',顺序:0},
{路径:'/b',顺序:1},
{路径:'/a/d',顺序:1},
{路径:'/a/c',顺序:0}
];
数据排序(函数(a,b){
如果(a.path==b.path){
返回a.订单
如果你有/products/a-snowboard和/products/b-snowboard,我可能想让b-snowboard排在a-snowboard之前。啊,那么你想先按
顺序排序,然后按字母顺序排序?你的例子是按字母顺序排序的,尽管有
顺序
,这就是为什么我没有看到它。如果你有/products/a-snowboard和/products/b-snowboard,我可能希望b-snowboard排在a-snowboard之前。啊,那么你想先按
顺序
排序,然后按字母顺序排序?您的示例是按字母顺序排序的,尽管
顺序
,这就是我错过它的原因。对于您更新的示例:
/cars
/bikes
是路径
//code>中的节点
cars
bikes
,两者都必须在开始处。是否可以按照我预期的方式对它们进行排序?我想要/parent、/parent/child、/parent、/parent、/parent/child,这取决于它们的顺序值。不使用sort函数,因为如果有两个随机元素,则必须在不使用/不知道其他元素的情况下,说第一个元素更低、更高或相等。但是,例如,如果您有元素
/bikes/some brand
/cars/bmw
,结果取决于元素
/cars
/bikes
。对于更新的示例:
/cars
/bikes
是路径
/code>中的节点
cars
bikes
,两者都必须在一开始。难道不可能按照我预期的方式对它们进行排序吗?我想要/parent、/parent/child、/parent、/parent、/parent/child,这取决于它们的顺序值。不使用sort函数,因为如果有两个随机元素,则必须在不使用/不知道其他元素的情况下,说第一个元素更低、更高或相等。但是,例如,如果您有元素
/bikes/某些品牌
/cars/bmw
,结果取决于元素
/cars
/bikes
var data = [
    { path: '/a', order: 0 },
    { path: '/b', order: 1 },
    { path: '/a/a', order: 1 },
    { path: '/a/c', order: 0 }
];


var result = data.sort(function (a, b) {
    if( a.order === b.order ){
        return a.path > b.path;
    }
    else {
        return a.order > b.order;
    }
});


var expected = [
    { path: '/a', order: 0 },
    { path: '/a/c', order: 0 },
    { path: '/a/a', order: 1 },
    { path: '/b', order: 1 }
];


if (_.isEqual(result, expected)) {
    alert('Success');       
} else {
    alert('Failed');  
};
​
var data = [
    { path: '/a', order: 0 },
    { path: '/b', order: 1 },
    { path: '/a/d', order: 1 },
    { path: '/a/c', order: 0 }
];

data.sort(function(a, b) {
  if (a.path === b.path) {
    return a.order < b.order ? -1 : 1;
  } else {
    return a.path < b.path ? -1 : 1;
  };
});