2016-06-21 11 views
0

最初にjsonデータをソートし、アルファベット順のソート、その後アルファベット順の3番目の大文字のソート方法は?

  • 2月26日
  • BACKSTAFFグループ
  • BACKSTAFFグループ2
  • ..私はこの

    [ { groupType: '1', 
        id: '158', 
        unreadMessages: '8', 
        ownerId: '332', 
        name: 'porras group' }, 
        { groupType: '1', 
        id: '163', 
        unreadMessages: '0', 
        ownerId: '337', 
        name: '11..' }, 
        { groupType: '1', 
        id: '173', 
        unreadMessages: '0', 
        ownerId: '334', 
        name: 'cate\'s' }, 
        { groupType: '1', 
        id: '174', 
        unreadMessages: '0', 
        ownerId: '328', 
        name: 'raju' }, 
        { groupType: '1', 
        id: '175', 
        unreadMessages: '0', 
        ownerId: '332', 
        name: 'abcde' }, 
        { groupType: '1', 
        id: '177', 
        unreadMessages: '0', 
        ownerId: '337', 
        name: '26 feb' }, 
        { groupType: '1', 
        id: '181', 
        unreadMessages: '0', 
        ownerId: '332', 
        name: 'new' }, 
        { groupType: '1', 
        id: '182', 
        unreadMessages: '0', 
        ownerId: '337', 
        name: 'jchhabra group' }, 
        { groupType: '1', 
        id: '186', 
        unreadMessages: '0', 
        ownerId: '337', 
        name: 'jch' }, 
        { groupType: '1', 
        id: '189', 
        unreadMessages: '0', 
        ownerId: '332', 
        name: 'hebe' }, 
        { groupType: '1', 
        id: '191', 
        unreadMessages: '0', 
        ownerId: '328', 
        name: 'ccgg' }, 
        { groupType: '1', 
        id: '202', 
        unreadMessages: '0', 
        ownerId: '332', 
        name: 'New Porras Group' }, 
        { groupType: '1', 
        id: '205', 
        unreadMessages: '0', 
        ownerId: '339', 
        name: 'simgroup' }, 
        { groupType: '1', 
        id: '210', 
        unreadMessages: '0', 
        ownerId: '339', 
        name: 'check' }, 
        { groupType: '1', 
        id: '222', 
        unreadMessages: '1', 
        ownerId: '333', 
        name: 'jgonzalez group' }, 
        { groupType: '1', 
        id: '223', 
        unreadMessages: '0', 
        ownerId: '334', 
        name: 'Cate 2' }, 
        { groupType: '2', 
        id: '150', 
        unreadMessages: '0', 
        ownerId: '0', 
        name: 'BACKSTAFF Group 2' }, 
        { groupType: '2', 
        id: '158', 
        unreadMessages: '0', 
        ownerId: '0', 
        name: 'BACKSTAFF Group' }, 
        { groupType: '2', 
        id: '173', 
        unreadMessages: '0', 
        ownerId: '0', 
        name: 'BACKSTAFF Group 3' } ] 
    

    のようなJSONデータを持っていると私は

    • 11のようにソートしますバックスタフグループ3
    • ケイト2
    • 新ポラスグループ
    • ABCDE
    • ケイトさん

    ようにJSONリストにアルファベットと 数字の最初に大文字のようにソートし、アルファベット順に を休ませることも可能ということです。

  • +1

    は、特定のプログラミング言語に関するこの質問はありますか? http://codegolf.stackexchange.com/ – Kira

    +0

    に問い合わせていない場合、これはnode.jsにあります –

    +0

    コレクションのプロパティまたはオブジェクトの順序を変更しますか?プロパティに問題がある場合は、クラスのプロパティの順序を変更してから再初期化する必要があると思います。コレクション内のオブジェクトがソートしたいものであれば、逆直列化や.OrderBy()anr reserialize – meJustAndrew

    答えて

    1

    コードで直接(データベースのようなデータソースではなく)それを注文するふりをすると、簡単なコードを書くことができます。

    まず、基本的なソート機能を構築した後は、任意のオブジェクトを並べ替えることができ、基本的な比較関数

    function compareString(a, b) { 
        if (!(a && b)) return Math.sign(a.length - b.length); 
    
        const ca = a.codePointAt(0); 
        const cb = b.codePointAt(0); 
        const cmp = Math.sign(ca - cb); 
    
        return cmp ? cmp : compareString(a.slice(1), b.slice(1)); 
    } 
    

    で始めてみましょう。一例として、オブジェクトのあなたの配列を取る:私はいくつかのES6の構文を使用してい

    const groups = //your groups here; 
    const sorted = groups.sort((a, b) => compareString(a.name, b.name)); 
    

    、ご質問があれば私に知らせてください。

    編集:私は車に乗っている(運転していない)ので、後ほど詳しく説明します。

    EDIT2:(グループ名のみで)上記のコードを使用して、このため手に入れた

    [ '11..', 
        '26 feb', 
        'BACKSTAFF Group', 
        'BACKSTAFF Group 2', 
        'BACKSTAFF Group 3', 
        'Cate 2', 
        'New Porras Group', 
        'abcde', 
        'cate\'s', 
        'ccgg', 
        'check', 
        'hebe', 
        'jch', 
        'jchhabra group', 
        'jgonzalez group', 
        'new', 
        'porras group', 
        'raju', 
        'simgroup' ] 
    

    EDIT3:私はひらめきを持って、何がしたいことは本当にデフォルトの文字列の順序であることに気づいてきた車を駐車しながらJavaScriptの。私はあなたの問題にとても集中していて、私がしていたことを完全に忘れてしまった。とにかく、上記のコードを参考にしましょう。しかし、このコードを使用して配列を並べ替えることができます

    const sorted = groups.sort((a, b) => a.name > b.name ? 1 : -1) 
    

    どのように簡単にすることができますか?基本的には、上記のコードと同じ戦略を使用し、文字列のASCIIコードを比較するだけです。 tableを見て、関数のソート優先順位を確認してください。

    UTF8サロゲートペアで不具合が発生することがありますが、

    +0

    より多くのコードが必要ですが、私は最初のアプローチを使用します。これは将来的な証明です。今ではASCII以外のものをサポートする必要はないかもしれませんが、将来は可能性があります。他の言語のコードをローカライズしたい場合は、英語以外の多くの言語(特にアジア言語)ではサロゲートペアを頻繁に使用します。コードポイントとUnicodeの詳細については、[this talk](https://youtu.be/zi0w7J7MCrk)をお勧めします。 –

    +0

    Hmm ...実際には、あなたがサロゲートペアを打ったときに壊れるあなたの再帰で 'slice'を使ったので、' console.log( '' slice(1)); '。おそらく、スライスをシミュレートするために 'u'フラグを付けたRegExpを使うことができます:' console.log(/.(.*)/u.exec( '')[;]( ''ノード6.0以上が必要です'u'フラグをサポートするため)、または' 'for ... of''(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for)を使うように書き直してください。 ..of)ループを再帰の代わりに使用します。 –

    +0

    RegExpオプションはおそらくかなり遅く、特にソートされるデータの量が重要な場合は、ソート機能には適していません。もう一つの選択肢は、展開演算子を使って配列に変換し、配列の代わりに配列をスライスすることです: 'console.log([...] ')。slice(1).join(' ')); '。パフォーマンステストはおそらく実行する必要がありますが、私はこれが遅すぎると思われますが、おそらくRegExpよりも速いでしょう。おそらくそれを行う最善の方法は 'for ... of'の書き換えです。 –

    関連する問題