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