Gibt es eine integrierte Möglichkeit, die Eigenschaften eines Objekts zu durchlaufen?

Lesezeit: 5 Minuten

Benutzer-Avatar
Ben

Gibt es eine Art Schnurrbart/Lenker durchzuschleifen Objekt Eigenschaften?

Also mit

var o = {
  bob : 'For sure',
  roger: 'Unknown',
  donkey: 'What an ass'
}

Kann ich dann was machen in der Template-Engine das wäre gleichbedeutend

for(var prop in o)
{
    // with say, prop a variable in the template and value the property value
}

?

Eingebaute Unterstützung seit Handlebars 1.0rc1

Unterstützung für diese Funktionalität wurde hinzugefügt zu Handlebars.js, sodass keine externen Helfer mehr benötigt werden.

Wie man es benutzt

Für Arrays:

{{#each myArray}}
    Index: {{@index}} Value = {{this}}
{{/each}}

Für Objekte:

{{#each myObject}}
    Key: {{@key}} Value = {{this}}
{{/each}}

Beachten Sie, dass nur Eigenschaften, die die übergeben hasOwnProperty Prüfung wird aufgezählt.

  • @Rafi: Ohne deine Datenstruktur zu kennen, kann man das nicht verstehen.

    – Jon

    22. Juli 2013 um 18:11 Uhr

  • @Rafi: meinst du nicht {{this.title}}?

    – nevyn

    17. Oktober 2013 um 9:43 Uhr

  • @qodeninja: Ganz einfach: So wie Sie sich auf die Werte in den obigen Beispielen beziehen – mit {{#each this}}. Ihre Begriffswahl ist auch verwirrend (was macht ein Objekt zur “höchsten Ebene” und ein anderes nicht? Was genau sind “vordefinierte” Schlüssel? usw.), also sollten Sie diese Konzepte vielleicht noch einmal überdenken.

    – Jon

    11. Februar 2014 um 9:42 Uhr

  • Wenn Sie sich nicht irren, ist dies nur mit v1.1.0 verfügbar, aber großartige Antwort, danke.

    – Renars Sirotine

    1. Juli 2015 um 14:23 Uhr

  • Wie machen Sie das nur für eine bestimmte Whitelist von Eigenschaften?

    – Marco Prinz

    28. Juli 2015 um 14:43 Uhr

Benutzer-Avatar
Ben

Es ist eigentlich ganz einfach als Helfer zu implementieren:

Handlebars.registerHelper('eachProperty', function(context, options) {
    var ret = "";
    for(var prop in context)
    {
        ret = ret + options.fn({property:prop,value:context[prop]});
    }
    return ret;
});

Dann verwenden Sie es so:

{{#eachProperty object}}
    {{property}}: {{value}}<br/>
{{/eachProperty }}

  • Sieht gut aus, müssen Sie innerhalb der Schleife eine hasOwnProperty-Prüfung hinzufügen, damit Sie nicht über Prototypeigenschaften iterieren?

    – Affen junge

    28. November 2012 um 11:26 Uhr

  • Tolle Lösung @Ben. Falls jemand versucht, dies mit Ember zu verwenden, finden Sie in meiner Antwort unten die Lösung, damit es funktioniert.

    – Fliegenfisch

    29. Mai 2013 um 19:54 Uhr

Benutzer-Avatar
Amit

BEARBEITEN: Lenker haben jetzt eine eingebaute Möglichkeit, dies zu erreichen; siehe die ausgewählte Antwort oben. Wenn Sie mit einfachem Schnurrbart arbeiten, gilt das Folgende weiterhin.

Moustache kann Elemente in einem Array durchlaufen. Daher würde ich vorschlagen, ein separates Datenobjekt zu erstellen, das so formatiert ist, dass Moustache damit arbeiten kann:

var o = {
  bob : 'For sure',
  roger: 'Unknown',
  donkey: 'What an ass'
},
mustacheFormattedData = { 'people' : [] };

for (var prop in o){
  if (o.hasOwnProperty(prop)){
    mustacheFormattedData['people'].push({
      'key' : prop,
      'value' : o[prop]
     });
  }
}

Jetzt würde Ihre Schnurrbart-Vorlage in etwa so aussehen:

{{#people}}
  {{key}} : {{value}}
{{/people}}

Schauen Sie sich hier den Abschnitt “Nicht leere Listen” an: https://github.com/janl/mustache.js

  • Am Ende ging ich mit Ihrem Vorschlag weiter, da ich sowieso einige zusätzliche Untereigenschaften übergeben muss. Danke für die Hilfe!

    – Ben

    30. Januar 2012 um 11:28 Uhr

  • Vielen Dank, Ihre Idee hat mir einen weiteren Tag der Suche nach Alternativen erspart. Diese Zeile ist der Schlüssel mustacheFormattedData = { ‘people’ : [] };

    – Matt

    2. September 2013 um 15:17 Uhr


  • Wie würden Sie das mit einem Array von “o”-Objekten machen?

    – rot888

    25. September 2014 um 19:49 Uhr

Die Antwort von @Amit ist gut, da sie sowohl in Moustache als auch in Handlebars funktioniert.

Was Nur-Lenker-Lösungen angeht, habe ich einige gesehen und die gefallen mir each_with_key Blockhelfer bei https://gist.github.com/1371586 der beste.

  • Es ermöglicht Ihnen, über Objektliterale zu iterieren, ohne sie zuerst umstrukturieren zu müssen, und
  • Es gibt Ihnen die Kontrolle darüber, was Sie die Schlüsselvariable nennen. Bei vielen anderen Lösungen müssen Sie bei der Verwendung von Objektschlüsseln mit dem Namen vorsichtig sein 'key'oder 'property'etc.

  • Danke @flynfish. Kontext ist eine Zeichenfolge in Ember? das scheint … etwas seltsam.

    – Ben

    30. Mai 2013 um 0:20 Uhr

  • Ja, ich bin mir nicht wirklich sicher, da ich neu bei Ember bin und immer noch versuche, mich darin zurechtzufinden.

    – Fliegenfisch

    30. Mai 2013 um 5:04 Uhr


Vielen Dank für Bens Lösung, mein Anwendungsfall, um nur bestimmte Felder der Reihe nach anzuzeigen

mit Objekt

Code:

    handlebars.registerHelper('eachToDisplayProperty', function(context, toDisplays, options) {
    var ret = "";
    var toDisplayKeyList = toDisplays.split(",");
    for(var i = 0; i < toDisplayKeyList.length; i++) {
        toDisplayKey = toDisplayKeyList[i];
        if(context[toDisplayKey]) {
            ret = ret + options.fn({
                property : toDisplayKey,
                value : context[toDisplayKey]
            });
        }

    }
    return ret;
});

Quellobjekt:

   { locationDesc:"abc", name:"ghi", description:"def", four:"you wont see this"}

Schablone:

{{#eachToDisplayProperty this "locationDesc,description,name"}}
    <div>
        {{property}} --- {{value}}
    </div>
    {{/eachToDisplayProperty}}

Ausgabe:

locationDesc --- abc
description --- def
name --- ghi

Dies ist eine Hilfsfunktion für mustacheJS, ohne die Daten vorzuformatieren und sie stattdessen während des Renderns abzurufen.

var data = {
    valueFromMap: function() {
        return function(text, render) {
            // "this" will be an object with map key property
            // text will be color that we have between the mustache-tags
            // in the template
            // render is the function that mustache gives us

            // still need to loop since we have no idea what the key is
            // but there will only be one
            for ( var key in this) {
                if (this.hasOwnProperty(key)) {
                    return render(this[key][text]);
                }
            }
        };
    },

    list: {
        blueHorse: {
            color: 'blue'
        },

        redHorse: {
            color: 'red'
        }
    }
};

Schablone:

{{#list}}
    {{#.}}<span>color: {{#valueFromMap}}color{{/valueFromMap}}</span> <br/>{{/.}}
{{/list}}

Ausgänge:

color: blue
color: red

(Die Reihenfolge kann zufällig sein – es ist eine Karte) Dies kann nützlich sein, wenn Sie das gewünschte Kartenelement kennen. Achten Sie nur auf falsche Werte.

Benutzer-Avatar
AamirR

Ich habe die alte Version verwendet 1.0.beta.6 des Lenkers, ich denke, irgendwo während 1.1 – 1.3 wurde diese Funktionalität hinzugefügt, also hat die Aktualisierung auf 1.3.0 das Problem gelöst, hier ist die Verwendung:

Verwendungszweck:

{{#each object}}
  Key {{@key}} : Value {{this}}
{{/people}}

1019550cookie-checkGibt es eine integrierte Möglichkeit, die Eigenschaften eines Objekts zu durchlaufen?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy