我正在尝试对以下数据进行排序:
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来断言我的排序函数:
我已经尝试了一些方法,但没有一个给出正确的结果。
完全不同的解决方案是按字母顺序添加订单和排序。但由于结果将最终成为网址,因此www.example.com/01-products/01-snowboard有点难看。
更新
我创建了一个更复杂的JSFiddle示例来展示我想要做的事情:
所以我试图对路径进行排序,但节点应按其级别的顺序排序。因此,当您按字母顺序排序但最后一个子项按顺序排序时,就像文件系统一样。
答案 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;
});
编辑。我改变了你的测试以显示顺序&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');
};