我有以下对象数组:
[
{
folder: 'ddd'
},
{
folder: 'aaa'
},
{
file: 'zzz'
}
]
我想首先按文件键排序,然后按文件夹键排序 - 我该怎么做?我写过这样的话:
var s = function (arr, type) {
arr.sort(function (a, b) {
var aHasKey = false, bHasKey = false;
var aValue, bValue;
if (a.hasOwnProperty(type) == true) {
aHasKey = true;
aValue = a[type];
}
if (b.hasOwnProperty(type) == true) {
bHasKey = true;
bValue = b[type];
}
if (aHasKey == true && bHasKey == true) {
if (aValue < bValue) return -1;
if (aValue == bValue) return 0;
if (aValue > bValue) return 1;
} else if (aHasKey == true) {
return 1;
} else if (bHasKey == true) {
return -1;
} else {
return 0;
}
});
};
s(arr, 'file');
s(arr, 'folder');
但它似乎只按文件夹排序,而不是按文件排序。我该怎么做?
答案 0 :(得分:0)
我建议您使用Underscore.js,它是一个轻量级的JS-Framework,具有各种有用的东西,它的权重仅为5.7kb。
然后你可以做(优先考虑文件):
list = _.sortBy(list, 'folder');
list = _.sortBy(list, 'file');
答案 1 :(得分:0)
如果未设置属性,您可以链接排序条件并使用默认字符串。
var data = [{ folder: 'ddd' }, { folder: 'aaa' }, { file: 'zzz' }];
data.sort(function (a, b) {
return (a.file || '').localeCompare(b.file || '') ||
(a.folder || '').localeCompare(b.folder || '');
})
console.log(data);
答案 2 :(得分:0)
实现这项工作的另一种方法是:
var arr = [{folder: 'iii'}, {folder: 'aaa'}, {file: 'zzz'}, {file: 'ppp'}, {file: 'qqq'},{folder: 'ddd'},{folder: 'sss'},{file: 'aaa'},{folder: 'rrr'},{folder: 'fff'},{file: 'rrr'},{file: 'mmm'}],
sorted = arr.sort((a,b) => a.file && b.file ? a.file.localeCompare(b.file)
: a.folder && b.folder ? a.folder.localeCompare(b.folder)
: a.file ? -1 : 1);
console.log(sorted);