ng-herhaal de richtlijn de gegevens sorteren bij gebruik van (sleutel, waarde)

Ik heb een code iets als deze met een ng-repeat = “(sleutel,waarde) in gegevens”.
In De Controller:

  $scope.Dates = {"Today":"30",
                  "This Week":"42",
                  "This Month": "Oct",
                  "This Quarter" : "Bad",
                  "This Year" : 2013
                                }

en ng-herhaal richtlijn

<div ng-repeat="(key,value) in Dates">
{{key}} ==> {{value}}
</div>

De output komt in een gesorteerde volgorde als

This Month ==> Oct
This Quarter ==> Bad
This Week ==> 42 
This Year ==> 2013
Today ==> 30

Hoe om zich te ontdoen van deze sorteren(vreemd) zoals ik het wil toetsen om te worden gebruikt in code.. ik gecontroleerd google-groep, maar was er een viool voor het gebruik van twee matrices, waarvan er één is het opslaan van de belangrijkste waarden. http://jsfiddle.net/Saulzar/puhML/3/b . Niet willen om te gaan met deze aanpak.

  • Je denkt alfabetische volgorde is vreemd?
  • Nee ik denk niet dat de alfabetische volgorde is vreemd, maar niet nodig hier . 😀 Het was bedoeld voor het vreemde gedrag !!
InformationsquelleAutor icanbeacoder | 2013-10-30



7 Replies
  1. 65

    Dit is een beperking van JavaScript niet Hoekig.

    Van ECMAScript Derde Editie:

    4.3.3 Een object is een lid van het type Object. Het is een ongeordende collectie van de eigenschappen van elk van die bevat een primitieve
    waarde, het object of de functie. Een functie die is opgeslagen in een eigenschap van een
    object wordt een methode genoemd.

    Van ECMAScript Language Specification

    De […] om van het opsommen van de eigenschappen van […]
    is niet opgegeven.

    Hoekige allerlei object toetsen expliciet om te bieden op zijn minst een soort van hardnekkige gedrag.

    Oplossing is om te itereren over uitgepakt toetsen:

    <div ng-repeat="key in keys(Dates)">
      {{key}} ==> {{Dates[key]}}
    </div>
    $scope.keys = function(obj){
      return obj? Object.keys(obj) : [];
    }
    
    $scope.Dates = {
      "Today":"30",
      "This Week":"42",
      "This Month": "Oct",
      "This Quarter" : "Bad",
      "This Year" : 2013
    };
    • <div ng-repeat=”toets toetsen(Data) | orderBy : toets”>
    • Het werkt niet als deze meer, hoekige heeft verwijderd van het sorteren. Zie het antwoord hieronder.
  2. 10

    EDIT: Ik heb ingediend een bug, voel je vrij om een +1 te

    ECMAScript geeft niet aan in welke volgorde de toetsen dienen te worden gegaan, echter alle belangrijke browsers implementeren objecten gekoppeld hash-kaart (behoudt de bestelling) en een stuk van de js-bibliotheken afhankelijk zijn van dit probleem en zo hebben we er aan gewend en het is niet van plan om te veranderen.

    Hoekige aan de andere kant (die totaal onverwachte) te sorteren op alfabetische volgorde. Ik heb het inspecteren van de source code zelf, het is hard-coded zijn er en het zou mooi zijn als het werd opgelost op een dag. Anders is het (k, v) in obj functie is volledig nutteloos.

    Je echt niet iets doen met dat tricking hoekige denken dat je het resultaat is een matrix is niet handig voor niets, want u zou moeten numerieke toetsen dan…

    Als dit goed is, kunt u definiëren getter voor lengte:

    Object.defineProperty(yourResultObjectOrPrototype, 'length', {
      get: function(){
        return Object.keys(this).length;
      }
    })

    Anders je moet een soort van filter die iterate object met for(var k in obj) en bewaar het resultaat in de array.

  3. 7

    Er is eigenlijk maar een antwoord:
    het heet orderBy en niet sorteren:

    https://docs.angularjs.org/api/ng/filter/orderBy

    {{ orderBy_expression | orderBy : expression : reverse}}

    <tr ng-repeat="friend in friends | orderBy:'-age'">
          <td>{{friend.name}}</td>
          <td>{{friend.phone}}</td>
          <td>{{friend.age}}</td>
        </tr>

    Uw lijst alleen moet worden van een lijst, en moet je misschien een index om te weten te stellen om

    $scope.Dates = [{index:1, "Today":"30"},
                      {index:2,"This Week":"42"},
                      {index:3,"This Month": "Oct"},
                      {index:4,"This Quarter" : "Bad"},
                      {index:5,"This Year" : 2013}]

    en dan

    <tr ng-repeat="(key, value) in Dates | orderBy:'index'">
              <td>{{key}}</td>
              <td>{{value}}</td>
             </tr>
    • MrE : Eigenlijk had ik echt niet wilde elke bestelling, het moet precies dezelfde volgorde waarin ik de gegevens ontvangen, Ook de tweede voorbeeld is een array van objecten, dus dat zal gewoon werken zonder index ook.
    • De index is er, zodat u kunt de volgorde die u wilt, want het is een array als u wijzen, wordt deze weergegeven in de matrix bestelling. Als je wilde een bepaalde volgorde, zou u de index of je zou moeten hebben om de items in de matrix in de juiste volgorde te beginnen met
  4. 6

    Dit is vaste als van Hoekige 1.4.

    Zie details hier:

    Eerder, de volgorde van de items bij het gebruik van ngRepeat te itereren over object-eigenschappen gegarandeerd consistent te zijn door het sorteren van de sleutels in alfabetische volgorde.

    Nu is de volgorde van de items is browser afhankelijk is gebaseerd op de volgorde terug van itereren over het object met de for key in obj syntaxis.

    Het lijkt erop dat browsers in het algemeen volgen de strategie van het verstrekken van de toetsen in de volgorde waarin ze zijn gedefinieerd…

    • Dit is gebroken, er is geen manier om te krijgen ng-herhaal sorteren meer aan het behoud van de toets ☹
  5. 2

    Ik was in staat om te sorteren op een Object van de Snaren door de Sleutel in alfabetische volgorde als deze met een ng-repeat!

    In mijn controller:

    $scope.build_config = {
      build_path :  "/x/eng/build",
      arch : "x86",
      variant : "debug",
      run_method : "boot", 
    };
    
    $scope.get_keys = function (obj) {
      if (obj)
        return Object.keys(obj);
    };

    In mijn HTML:

    <tr ng-repeat="key in get_keys(build_config) | orderBy:'toString()'">
          <td> {{key}} </td>
          <td> {{selected.build_config[key]}} </td>
    </tr>
  6. 1

    Object.toetsen worden er geen reserve van de bestelling – FYI
    https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys

    //array-object met de willekeurige toets te bestellen

    var an_obj = { 100: 'a', 2: 'b', 7: 'c' };
    console.log(Object.keys(an_obj)); //console: ['2', '7', '100']

    Ik omzetten naar een array van object

    $scope.Dates = [
            { id: "Today",      value:"30" },
            { id: "This Week",  value:"42" },
            { id: "This Month", value: "Oct" },
            { id: "This Quarter", value : "Bad" },
            { id: "This Year",  value : 2013 }
        ];
    
    <li ng-repeat="date in Dates">{{date.id}} -> {{date.value}}</li>

    http://jsfiddle.net/2hqew68k/1/

  7. 0

    Goed, zoals uitgelegd in Hoekige documentatie voor ngRepeat

    https://docs.angularjs.org/api/ng/directive/ngRepeat#iterating-over-object-properties

    gebruiken om te itereren over de eigenschappen van een object, het zal niet werken

    De ingebouwde filters orderBy en filter werkt niet met objecten, en
    gooi je een fout als het gebruikt wordt met een.

    De beste oplossing in dit geval denk ik dat het gebruik van arrays in plaats van een object en de eigenschappen. Daarom, gewoon omzetten naar een array, het itereren van de eigenschappen van het object en druk op de new array bijvoorbeeld. Immers, ik denk dat dat zou de natuurlijke keuze voor een collectie, in plaats van een enkel object met vele eigenschappen.

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *