5

テキストに数字がある場合、ng-repeat orderByを使用する際に問題があります。AngularJS ng-repeat orderBy注文番号が間違っています

サンプルデータ:

[ 
    {booth: 'p1'}, 
    {booth: 'p2'}, 
    {booth: 'p3'}, 
    {booth: 'p4/5'}, 
    {booth: 'p6/7'}, 
    {booth: 'p8'}, 
    {booth: 'p9'}, 
    {booth: 'p10'}, 
    {booth: 'p11'}, 
    {booth: 'p12'}, 
    {booth: 'p13'} 
] 

ORDERBYとNG-繰り返し使用: P1、P10、P11、P13、P2、電気ショック療法

: 'ブース' のようなリストに出ています私はこれが期待された動作であると理解していますが、どのように私が期待している順序でブースをリストアップすることができるのか誰にも分かりますか?だろう

は: P1、P2、P3、P4/5、電気ショック療法

私はまた、数字は整数ではありませんでしたが、同じ問題を返したため、問題であった場合見て試してみました。

ご協力いただきありがとうございます。

+0

私はSO、私はまだ自分の質問を解決することはできませんするにはあまりにも新しいですが、ここで問題に私の答えですので。私はカスタムフィルタを使用してこれを解決しました。注:フィドルでは、parseFloatとスライスがあります。このフィルタは、渡すデータに基づいて変更する必要があります。 Fiddle:http://jsfiddle.net/L3HjP/3/ – creatifyme

答えて

12

JavaScriptの組み込みの文字列比較は、あなたの目的のためには機能しません。私は必要なのは自然な種類ので、人間のやり方で文字列を並べ替えることだと思います。私はブログhereから確かな実装hereを見つけました。かなり包括的で、かなり複雑なので、私はここでソースコードを説明しようとしません(説明のためにブログをチェックしてください)。

そのあとのような自然なソート用のカスタムフィルタを作成し、HTMLで使用することができます。

HTML

<div ng-app="myApp"> 
    <div ng-controller="ctrlMain"> 
     <div ng-repeat="item in data | naturalSort">{{item.booth}}</div> 
    </div> 
</div> 

Javascriptを - 私は、ソートの実装を残してきましたそれは長いと私によって作成されていないので、しかし実際にそれを見るために、下のデモをチェックしてください。 (それはあなたの例のために少しやり過ぎかもしれないが)、以下のデモで

app.filter('naturalSort',function(){ 
    function naturalSort (a, b) { 
     // Please see the demo for this code, it is somewhat long. 
    } 
    return function(arrInput) { 
     var arr = arrInput.sort(function(a, b) { 
      return naturalSort(a.booth,b.booth); 
     }); 
     return arr; 
    } 
}); 

ソートの実装では、多くの状況で使用することができる様々な可能性(日付、進値、空白文字)をカバーしています。

Here is a demo

+2

あなたはここにいる素晴らしい自然なソートアルゴリズムです。 – SoluableNonagon