1. ホーム
  2. javascript

[解決済み] AngularJSのプロパティによるソート

2023-02-23 14:08:57

質問

私は、あるデータをプロパティでソートしようとしています。以下は、私が動作するはずだと思った例ですが、そうではありません。

HTML部分です。

<div ng-app='myApp'>
    <div ng-controller="controller">
    <ul>
        <li ng-repeat="(key, value) in testData | orderBy:'value.order'">
            {{value.order}}. {{key}} -> {{value.name}}
        </li>
    </ul>
    </div>
</div>

JSの部分です。

var myApp = angular.module('myApp', []);

myApp.controller('controller', ['$scope', function ($scope) {

    $scope.testData = {
        C: {name:"CData", order: 1},
        B: {name:"BData", order: 2},
        A: {name:"AData", order: 3},
    }

}]);

そして、その結果。

  1. A -> AData
  2. B -> BDデータ
  3. C -> CDデータ

...IMHOではこのように表示されるはずです。

  1. C -> CData
  2. B -> BDデータ
  3. A -> ADデータ

私は何かを見逃しましたか(ここに準備されている JSFiddle で実験する準備ができています)?

どのように解決するのですか?

AngularJSのorderByフィルターは配列をサポートしているだけで、オブジェクトはサポートしていません。だから、あなたはあなたのためにソートを行う独自の小さなフィルタを記述する必要があります。

または、扱うデータの形式を変更します(それに影響を与えることができる場合)。オブジェクトを含む配列は、ネイティブのorderByフィルターでソート可能です。

ここで、私の orderObjectBy フィルタです。

app.filter('orderObjectBy', function(){
 return function(input, attribute) {
    if (!angular.isObject(input)) return input;

    var array = [];
    for(var objectKey in input) {
        array.push(input[objectKey]);
    }

    array.sort(function(a, b){
        a = parseInt(a[attribute]);
        b = parseInt(b[attribute]);
        return a - b;
    });
    return array;
 }
});

ビューでの使用法。

<div class="item" ng-repeat="item in items | orderObjectBy:'position'">
    //...
</div>

この例ではオブジェクトに位置属性が必要ですが、ビューで定義するだけで、オブジェクトに(整数を含む)任意の属性を使用する柔軟性があります。

JSONの例です。

{
    "123": {"name": "Test B", "position": "2"},
    "456": {"name": "Test A", "position": "1"}
}

使い方を示すフィドルを以下に示します。 http://jsfiddle.net/4tkj8/1/