2016-09-20 2 views
0

Iは、以下のオブジェクトの配列を持っている:ソート

[ 
{ 
    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

この仕事を実施する1つの他の方法です。

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