2016-06-21 4 views
0

Ich habe ein JSON-Daten wie dieseWie sortiert man JSON-Daten zuerst mit numerischen, zweiten Großbuchstaben mit alphabetischer Sortierung und dann dritten alphabetisch?

[ { 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' } ] 

und ich möchte, wie

  • Backstaff Gruppe
  • Backstaff Gruppe 2
    • 11 ..
    • 26. Februar sortieren BACKSTAFF Gruppe 3
    • Cate 2
    • New Porras Gruppe
    • abcde
    • Cates

    so weiter ist das möglich in json Liste wie numerische zuerst, dann Großbuchstaben mit alphabetischen und ruhen alphabetisch zu sortieren.

  • +1

    ist diese Frage im Zusammenhang mit einer bestimmten Programmiersprache? Wenn nicht in http://codegolf.stackexchange.com/ – Kira

    +0

    fragen, das ist in node.js –

    +0

    Möchten Sie Eigenschaften oder Objekt in der Sammlung neu anordnen? Wenn die Eigenschaften das Problem sind, denke ich, dass Sie die Reihenfolge der Eigenschaften in der Klasse ändern und dann erneut reservieren müssen.Wenn die Objekte in der Auflistung sind, was Sie sortieren möchten, können Sie deserialize und verwenden .OrderBy() anr reserialize – meJustAndrew

    Antwort

    1

    Vorausgesetzt, dass Sie vorgeben, es direkt im Code (und nicht in der Datenquelle wie eine Datenbank) zu bestellen, können Sie etwas einfachen Code schreiben, um es zu tun.

    Lassen Sie sich zunächst mit dem Grunde beginnt Vergleichsfunktion

    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)); 
    } 
    

    Nach der grundlegenden Sortierfunktion Aufbau Sie jedes Objekt sortieren. Nehmen Sie Ihre Array von Objekten als Beispiel:

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

    ich einige ES6 Syntax, lassen Sie mich wissen, wenn Sie Fragen haben.

    EDIT: Ich bin jetzt auf ein Auto (nicht fahren), ich werde den vollen Code später erklären.

    EDIT2: Erhielt diese um den Code oben (nur bei Gruppennamen) mit

    [ '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: Während Parken des Autos habe ich eine Epiphanie bekam und erkannte, dass, was Sie wollen, ist wirklich der Standard-String-Bestell von Javascript. Ich war so konzentriert auf dein Problem und ich habe komplett vergessen was ich tat. Wie auch immer, ich werde den obigen Code als Referenz angeben. Aber Sie können diesen Code verwenden, um Ihr Array zu sortieren

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

    Wie einfach kann es sein? Im Grunde verwendet es die gleiche Strategie des obigen Codes, vergleicht nur die ASCII-Codes der Strings. Werfen Sie einen Blick auf die table, um die Sortierpriorität der Funktion zu überprüfen.

    Die Dinge können mit UTF8 Ersatzpaare böse werden, obwohl

    +0

    Obwohl es mehr Code erfordert, würde ich den ersten Ansatz verwenden, es ist zukunftssicherer. Im Moment müssen Sie möglicherweise nicht mehr als ASCII unterstützen, aber in Zukunft könnten Sie das tun. Wenn Sie Ihren Code für andere Sprachen lokalisieren möchten, verwenden viele nicht-englische Sprachen (insbesondere asiatische Sprachen) häufig Ersatzpaare. Für weitere Informationen über Codepunkte und Unicode empfehle ich [dieses Gespräch] (https://youtu.be/zi0w7J7MCrk). –

    +0

    Hmm ... tatsächlich, da du 'slice' in deiner Rekursion benutzt hast, die bricht, wenn du ein Ersatzpaar triffst:' console.log (''. Slice (1)); '. Sie können vielleicht eine RegExp mit dem 'u'-Flag verwenden, um ein Slice zu simulieren:' console.log (/.(.*)/ u.exec ('') [1]); '(das würde Knoten 6.0 oder höher erfordern für 'u 'Flag-Unterstützung) oder vielleicht schreiben Sie es um ein [' für ... von'] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for. ..of) Schleife statt Rekursion. –

    +0

    Die RegExp-Option wäre wahrscheinlich ziemlich langsam, keine gute Sache für eine Sortierfunktion, insbesondere wenn die Menge der zu sortierenden Daten signifikant ist. Eine andere Option wäre, den Spread-Operator zu verwenden, um ihn in ein Array umzuwandeln und dann das Array anstelle des Strings in Scheiben zu schneiden: 'console.log ([... '']. Slice (1) .join ('')); '. Leistungstests müssten wahrscheinlich durchgeführt werden, ich vermute, dass dies auch langsam wäre, aber wahrscheinlich schneller als RegExp. Ein "for ... of" Neuschreiben wäre wahrscheinlich der beste Weg, dies zu tun. –

    Verwandte Themen