1

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

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

我发现了一篇关于分层数据的好帖子:

在关系数据库中存储分层数据的选项有哪些?

从那个问题我想我正在使用一张平板:

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

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

我设置了一个 JsFiddle 来断言我的排序功能:

http://jsfiddle.net/U76ch/

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

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

更新

我创建了一个更复杂的 JSFiddle 示例来展示我正在尝试做的事情:

http://jsfiddle.net/YSd3d/

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

4

2 回答 2

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;
  };
});
于 2012-07-01T12:47:12.477 回答
0

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

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

http://jsfiddle.net/sftdq/


编辑。我将您的测试更改为显示 order > abc。在jsfiddle 示例中工作

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');  
};
​
于 2012-07-01T12:46:01.277 回答