2013-06-14 10 views
10

AngularJSのアイテムのリストをどのようにランダムに並べるのですか?私は組み込みのorderByフィルタが機能すると思っていましたが、私はモデルに追加のデータを追加しないとどうしたらよいか分かりません。好きなものは素晴らしいだろう。AngularJSの使用コレクションの順序をランダム化するにはどうすればよいですか?

item in items | orderBy:random 

私の次の考えはカスタムフィルタを作成することでしたが、既に利用可能なものがあればそれを避けることをお勧めします。 、

$scope.random = function(){ 
    return 0.5 - Math.random(); 
}; 

これは時々、正、時に負のランダムな値を返します。

+4

Angularのエキスパートではありませんが、フィルタはいつでも評価され、常に項目をシャッフルしています。アイテムにロードされたときにアイテムに「ランダム」プロパティを追加し、そのプロパティで並べ替えることができます。 – Dogbert

+0

@Dogbertにはその権利があります。現在のバージョンのAngularJSでは、コンソールで 'infdig'エラーが発生します。ソートは同じ注文が2回繰り返されるまで繰り返されるため、以下の[受け付けられた回答](http://stackoverflow.com/a/17102267/901048)がコンソールに 'infdig'エラーを生成します。 [この質問](http://stackoverflow.com/questions/21586369/random-orderby-in-angularjs-1-2-returns-infdig-errors)を参照してください。 – Blazemonger

答えて

17

orderByので、あなたが上記のあなたのHTMLを使用してのような範囲で機能randomを定義することができるだけでarray.sortように、関数のパラメータを取ることができます場合によっては0で、配列をランダムにソートします。迅速なフィドルのsh0ber方法を行う

+0

しかし、値は一致しません(同じ順序で 'a SJuan76

+0

私の元のコメントを準備。それぞれの比較がランダムであれば、 'a c'で終わることができます。ソートアルゴリズムでそれを処理できることを確認してください(実際は 'order'の定義と一致しません)。 Dogbertのコメントは、注文がランダムかつ一貫した一貫性のあるランダム注文の方法について概説しています。 – SJuan76

+0

それはあなたのために働いてうれしい。あなたはそれを呼び出すために括弧を使用する必要はありません、下記の@owenmeadからフィドルをチェックしてください。 – sh0ber

6

はうまく動作するようです: http://jsfiddle.net/owenmead/fa4v8/1/

<div ng-controller="MyCtrl"> 
    <p ng-repeat="i in list|orderBy:random">{{i}}</p> 
</div> 

function MyCtrl($scope) { 
    $scope.list = ['a', 'b', 'c', 'd', 'e', 'f', 'g']; 
    $scope.random = function() { 
    return 0.5 - Math.random(); 
    } 
} 

角度のORDERBYは、リストのコピーにはJavaScriptのソート()を使用しています。別の答えを見ると、特定のブラウザは安定していて、他のブラウザは安定していません。おそらく、いくつかのブラウザでフィドルを試してみるとよいでしょう。 Array.sort Sorting Stability in Different Browsers

PSです。 012担当者がいないので、sh0berの答えにコメントできませんでした

+9

FYI - これは 'Error:[$ rootScope:infdig]' –

+1

の 'Error: [$ rootScope:infdig] 'これは、ダイジェストサイクルがランダム関数を2回実行し、結果が矛盾するので、それが再試行する(したがって、無限のダイジェストサイクルまたは" infdig "を作成する)後のバージョンの角度で発生します。 –

+1

@ DavidAndertonのポイント(これは非常に役に立ちました)。私は、エラーを投げていた2つの数値フィールドがランダム化されていることを認識しました。私は 'track by model.id'を追加しました。 – cchapman

関連する問題