具有分组功能的 JavaScript 排序函数

Javascript sort function with grouping

本文关键字:JavaScript 排序 函数 功能      更新时间:2023-09-26

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

更新:这是用于节点的javascript.js

我有一堆文件和文件夹作为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);
}));
从一个

字符串中减去另一个字符串将始终给出"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

你的名字不是数字,你不能通过减去它们来得到比较值。用

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

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

如果项目类型相同,我们将比较名称。在这种情况下,两个名称可能相同,在这种情况下,我们必须返回 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 />');
}

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

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

虽然它比其他解决方案长,但恕我直言,它的可读性要高得多。