Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/432.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带分组的Javascript排序函数_Javascript_Sorting - Fatal编程技术网

带分组的Javascript排序函数

带分组的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} ] 我想对这个

在编写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 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);