Javascript排序功能与分组

时间:2014-11-27 19:30:46

标签: javascript sorting

编写javascript sort函数时遇到问题,让我可以执行以下操作:

更新:这是node.js的javascript

我有一堆文件和文件夹作为JSON对象,具有以下属性

[
  {"name":"Folder B","isFolder":true},
  {"name":"File A","isFolder":false},
  {"name":"Folder A","isFolder":true},
  {"name":"File B","isFolder":false}
]

我想对此数组进行排序,以便将文件夹分组在顶部并按字母顺序排序,然后按字母顺序排列文件

[
  {"name":"Folder A","isFolder":true},
  {"name":"Folder B","isFolder":true},
  {"name":"File A","isFolder":false},
  {"name":"File B","isFolder":false}
]

经过对stackoverflow的大量研究后,我已经提出了这个问题,但它只是将文件夹分组在顶部,并没有按名称排序..想法?

array.sort(function(a,b){
    return (b.isFolder-a.isFolder) || (b.name - a.name);
}));

4 个答案:

答案 0 :(得分:3)

从另一个字符串中减去一个字符串将始终给出“NaN”,而是使用localeCompare()。

array.sort(function(a,b){
    return (b.isFolder-a.isFolder) || (a.name.toString().localeCompare(b.name));
});

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/localeCompare

答案 1 :(得分:1)

您的姓名不是数字,您无法通过减去它们来获得比较值。使用

array.sort(function(a,b){
    return (b.isFolder-a.isFolder) || +(a.name>b.name)||-(a.name<b.name);
});

答案 2 :(得分:0)

下面的排序功能首先检查要比较的项目是否属于不同类型,即一个是文件夹,另一个是文件。如果是这样,该文件夹必须首先,该函数返回-1。如果没有,我们返回1,因为如果第二个项目要在第一个项目之前,那就是sort函数需要的。

如果项目属于同一类型,我们会比较名称。在这种情况下,两个名称可能是相同的,在这种情况下我们必须返回0。

var array = [                            // Test data.
  {"name":"Folder B","isFolder":true},
  {"name":"File A","isFolder":false},
  {"name":"Folder A","isFolder":true},
  {"name":"File B","isFolder":false}
];

array.sort(function(a, b) {
  if (a.isFolder != b.isFolder) {        // Is one a folder and
     return (a.isFolder ? -1 : 1);       //  the other a file?
  }                                      // If not, compare the
  return a.name.localeCompare(b.name);   //  the names.
});

for (var i = 0; i < array.length; ++i) { // Check the result.
  document.write(array[i].name+' '+array[i].isFolder+'<br />');
}

答案 3 :(得分:0)

这是另一种可能的解决方案;

var objects = [
  {"name":"Folder B","isFolder":true},
  {"name":"File A","isFolder":false},
  {"name":"Folder A","isFolder":true},
  {"name":"File B","isFolder":false}
];

function isFolder(object) {
    return object.isFolder;
}

function isNotFolder(object) {
    return !object.isFolder;
}

function byName(a, b) {
     return a.name.localeCompare(b.name);
}

var folders = objects.filter(isFolder).sort(byName),
    files = objects.filter(isNotFolder).sort(byName);

var allSorted = folders.concat(files);

console.log(allSorted);

虽然它比其他解决方案更长,但恕我直言更易读。