2016-09-20 68 views
0

,我有以下對象數組:排序多個索引

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

但它似乎只對文件夾,而不是文件進行排序。我應該怎麼做?

+1

請添加更多的數據進行排序。擁有所有項目文件夾和文件密鑰? –

回答

0

我建議你使用Underscore.js,它是一個輕量級的JS框架,包含所有有用的東西,它的權重只有5.7kb。

http://underscorejs.org/

那麼你可以做(​​與文件的優先級):

list = _.sortBy(list, 'folder'); 
list = _.sortBy(list, 'file'); 
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);

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