具有分组功能的 JavaScript 排序函数
Javascript sort function with grouping
在编写 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);
虽然它比其他解决方案长,但恕我直言,它的可读性要高得多。
相关文章:
- Javascript排序的图像弹出窗口..可以't单独弹出
- Javascript排序字符串或数字
- 循环的JavaScript排序问题
- 不同浏览器上的javascript排序不明确
- Javascript排序索引链接数组
- Javascript排序-奇怪的行为,任何想法
- JavaScript排序算法不起作用 - 任何明显的我做错了
- JavaScript排序函数未按预期工作
- Javascript排序和排序
- 基于比较子元素内容和目标标题内容的Javascript排序元素
- Javascript排序对象日期
- javascript排序多维数组
- 对象的数组列表的Javascript排序列表-基于特定的数组列表
- JavaScript排序函数排序时不应该排序
- 返回键的javascript排序函数
- 不带插件的JavaScript排序日期
- Javascript排序函数错误地更改了元素'数组中的位置
- JavaScript 排序顺序错误
- JavaScript 排序函数
- 打开 Graph API 排序顺序,或简单的 jQuery/JavaScript 排序