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

时间:2012-07-01 12:40:26

标签: javascript hierarchical-data

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

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

分为:

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

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

What are the options for storing hierarchical data in a relational database?

从这个问题我想我正在使用一张平台:

  

对邻接列表的修改,为每条记录添加等级和等级(例如排序)列。

SO问题中的链接已关闭,因此我无法从中获取更多信息。

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

http://jsfiddle.net/U76ch/

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

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

更新

我创建了一个更复杂的JSFiddle示例来展示我想要做的事情:

http://jsfiddle.net/YSd3d/

所以我试图对路径进行排序,但节点应按其级别的顺序排序。因此,当您按字母顺序排序但最后一个子项按顺序排序时,就像文件系统一样。

2 个答案:

答案 0 :(得分:4)

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;
  };
});

答案 1 :(得分:0)

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

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

http://jsfiddle.net/sftdq/


编辑。我改变了你的测试以显示顺序&gt; ABC。适用于jsfiddle exmample

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');  
};
​