web-dev-qa-db-ja.com

プロパティによるオブジェクトの配列の並べ替え

私はデータベースからこのコレクションを持っています:

var items = [{ 'Name':'Michael', 'TypeId':1 }
        { 'Name':'Max', 'TypeId':1 }
        { 'Name':'Andre', 'TypeId':1 }
        { 'Name':'Georg', 'TypeId':2 }
        { 'Name':'Greg', 'TypeId':3 }
        { 'Name':'Mitchell', 'TypeId':2 }
        { 'Name':'Ptro', 'TypeId':1 }
        { 'Name':'Helga', 'TypeId':1 }
        { 'Name':'Seruin', 'TypeId':2 }
        { 'Name':'Ann', 'TypeId':3 }
        { 'Name':'Marta', 'TypeId':2 }]

このアイテムをTypeIdの増加順に並べ替える必要があります。

そのように:

var itemsSorted = [{ 'Name':'Michael', 'TypeId':1 }
        { 'Name':'Max', 'TypeId':1 }
        { 'Name':'Andre', 'TypeId':1 }
        { 'Name':'Ptro', 'TypeId':1 }
        { 'Name':'Helga', 'TypeId':1 }
        { 'Name':'Georg', 'TypeId':2 }
        { 'Name':'Mitchell', 'TypeId':2 }
        { 'Name':'Marta', 'TypeId':2 }]
        { 'Name':'Seruin', 'TypeId':2 }
        { 'Name':'Greg', 'TypeId':3 }
        { 'Name':'Ann', 'TypeId':3 }

オブジェクトの配列をプロパティでソートできるJavaScriptの組み込み関数はありますか?

10
Michael

orderByフィルターを使用できます。

var itemsSorted  = $filter('orderBy')(items, 'TypeId')

表示中

ng-repeat="item in items | orderBy: 'TypeId'"

デフォルトでは、フィルターは昇順(明示は+TypeId)であるため、-TypeIdを使用して降順にすることができます。


追加事項

複数のプロパティでソートする場合は、['TypeId', 'Name']のようなstringの代わりに配列を使用してください

ng-repeat="item in items | orderBy: ['TypeId', 'Name']"

コントローラ内で手動フィルタリングを行うと、パフォーマンスが大幅に向上します。ビューでのフィルタリングは、ダイジェストサイクルが発生するたびにng-repeatエクスプレスとバインディングを評価するため、遅くなります。一般に、小さなコレクションではパフォーマンスの低下は見られませんが、大きなコレクションでは、ビューでのフィルタリングが遅くなります。

33
Pankaj Parkar

Js sort関数とternary operator

var items = [{ 'Name':'Michael', 'TypeId':1 },
            { 'Name':'Max', 'TypeId':1 },
            { 'Name':'Andre', 'TypeId':1 },
            { 'Name':'Georg', 'TypeId':2 },
            { 'Name':'Greg', 'TypeId':3 },
            { 'Name':'Mitchell', 'TypeId':2 },
            { 'Name':'Ptro', 'TypeId':1 },
            { 'Name':'Helga', 'TypeId':1 },
            { 'Name':'Seruin', 'TypeId':2 },
            { 'Name':'Ann', 'TypeId':3 },
            { 'Name':'Marta', 'TypeId':2 }]
    var sortedArray = items.sort(function(a,b){
     return a.TypeId >b.TypeId?1:a.TypeId <b.TypeId?-1:0
    })
    console.log(sortedArray);

JSFIDDLEの例

6
brk

Array.prototype.sort

var items = [{ 'Name':'Michael', 'TypeId':1 },
        { 'Name':'Max', 'TypeId':1 },
        { 'Name':'Andre', 'TypeId':1 },
        { 'Name':'Georg', 'TypeId':2 },
        { 'Name':'Greg', 'TypeId':3 },
        { 'Name':'Mitchell', 'TypeId':2 },
        { 'Name':'Ptro', 'TypeId':1 },
        { 'Name':'Helga', 'TypeId':1 },
        { 'Name':'Seruin', 'TypeId':2 },
        { 'Name':'Ann', 'TypeId':3 },
        { 'Name':'Marta', 'TypeId':2 }];


items.sort(function(a, b) { return a.TypeId - b.TypeId; })

console.table(items);

document.getElementById('demo').innerHTML = JSON.stringify(items, null, 4);
<pre id="demo"></pre>
4
Ori Drori

テンプレート内:

<li ng-repeat="item in items | orderBy:'TypeId'">...</li>

コントローラー/サービス内:

vm.sortedItems = $filter('orderBy')(items, 'TypeId');
3
GG.