2

ng-repeat ブロック内でフィルター (またはその他の方法) を使用して angular.js で 1:1 オブジェクト マップを並べ替える方法はありますか?

私は持っている:

obj:{
     a:3,
     c:5,
     d:1,
     g:15
}

基本的に、私はこのようなことをしたいと思っています:

<div ng-repeat="item in obj | orderBy:'value'"> {{ item.value }}</div>

そのデータ表現をキーまたは値でソートできるようにしたいと思います。angular OrderBy は配列のみをソートするため、そのオブジェクトはソートされません。ただし、そのオブジェクトをキーと値をプロパティとして持つオブジェクトの配列に変換できる場合 (できれば 'toArray' というフィルターを使用します):

var arr = [
  { 
     key:'a',
     value:'3'
  },
  {
    key:'c',
    value:5
  },
  ....
]

次に、次のようなものを使用できます。

<div ng-repeat="item in obj | toArray | orderBy:'value'"> {{ item.value }}</div>

ただし、そのようなフィルターを作成しようとすると、'10 回の $digest() 反復に達しました。中止します!反復ごとにオブジェクトの新しい配列を更新するため、エラーが発生します。

コントローラーでデータを再構築することなく、1:1 オブジェクト マップを並べ替えるための最良の (または任意の) ソリューションは何ですか?

4

2 に答える 2

3

angular.js にアンダースコア関数を導入するangular-underscoreを試してください。次に、次のようなコードを記述できます。

<div ng-repeat="item in values(obj) | orderBy:identity"> {{ item }}</div>

値のみを取得します。また

<div ng-repeat="item in pairs(obj) | orderBy:last"> Key: {{ item[0] }}; Value: {{item[1]}}</div>

キーと値の両方を取得します。

とても簡単です。プランカーはこちら: http://plnkr.co/edit/Zb4XpaQUXZ8nZJqR493b?p=preview

于 2014-06-26T04:02:07.620 に答える