带分组的Javascript排序函数
在编写javascript排序函数时遇到问题,该函数允许我执行以下操作: 更新:这是node.js的javascript 我有一堆文件和文件夹作为JSON对象,具有以下属性带分组的Javascript排序函数,javascript,sorting,Javascript,Sorting,在编写javascript排序函数时遇到问题,该函数允许我执行以下操作: 更新:这是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 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);
}));
下面的排序函数首先检查要比较的项目是否属于不同的类型,也就是说,一个是文件夹,另一个是文件。如果是这样,文件夹必须放在第一位,函数返回-1。如果不是,则返回1,因为如果第二项位于第一项之前,则排序函数需要1 如果项目类型相同,则比较名称。在本例中,两个名称可能相同,在这种情况下,我们必须返回0
var数组=[//测试数据。
{“name”:“Folder B”,“isFolder”:true},
{“name”:“File A”,“isFolder”:false},
{“name”:“Folder A”,“isFolder”:true},
{“名称”:“文件B”,“isFolder”:false}
];
array.sort(函数(a,b){
如果(a.isFolder!=b.isFolder){//是一个文件夹,并且
return(a.isFolder?-1:1);//另一个是文件?
}//如果不是,则比较
返回a.name.localeCompare(b.name);//名称。
});
对于(var i=0;i ');
}
从一个字符串减去另一个字符串将始终得到“NaN”,请使用localeCompare()
您的名字不是数字,您不能通过减去它们来获得比较值。使用
array.sort(function(a,b){
return (b.isFolder-a.isFolder) || +(a.name>b.name)||-(a.name<b.name);
});
array.sort(函数(a,b){
return(b.isFolder-a.isFolder)| |+(a.name>b.name)| |-(a.name这是另一种可能的解决方案
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);
虽然它的方式比其他的解决方案要长得多,但是它的可读性更高。你是否考虑过使用<代码>下划线< /代码>?它有一个很棒的<代码> SotBube < /Cuff>函数:<代码> SotBube(数据,“ISFACKE”) <代码> SoTBBY(数据,“名称”)
对不起,我应该提到node.js上有这个功能。哦,localeCompare做到了,但是node.js中到底是如何工作的呢?不幸的是,我从来没有使用过node.js,所以我不能帮你。
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);