编写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);
}));
答案 0 :(得分:3)
从另一个字符串中减去一个字符串将始终给出“NaN”,而是使用localeCompare()。
array.sort(function(a,b){
return (b.isFolder-a.isFolder) || (a.name.toString().localeCompare(b.name));
});
答案 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);
虽然它比其他解决方案更长,但恕我直言更易读。