按多个索引排序

时间:2016-09-20 09:24:56

标签: javascript arrays sorting

我有以下对象数组:

[
 {
  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');

但它似乎只按文件夹排序,而不是按文件排序。我该怎么做?

3 个答案:

答案 0 :(得分:0)

我建议您使用Underscore.js,它是一个轻量级的JS-Framework,具有各种有用的东西,它的权重仅为5.7kb。

http://underscorejs.org/

然后你可以做(​​优先考虑文件):

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);