2015-08-01 15 views
8

Ich habe eine einfache Objektliteral, die Adresse ist, wie hier gezeigtejs wie Objekt iterieren

address: { 
    country: String, 
    state: String, 
    city: String, 
    zip: String, 
    street: String 
} 

und seinem Inneren ein Objekt, das ich mit Express.js Funktion machen vorbei bin.

in meiner Vorlage Seite versucht, ich bin in diesem Objekt for-Schleife wie folgt:

<% for (var prop in artist.address) { %> 
    <%- artist.address[prop] %> 
<% } %> 

die Daten, die Ausgabe aber die ejs Funktionen auch wie so beinhaltet:

function() { return this.get(path); } function() { return this.get(path); } yafo 09988 jerusalem israel israeli [object Object] undefined undefined undefined undefined undefined undefined undefined undefined undefined undefined undefined undefined undefined undefined [object Object] [object Object] function() { var self = this , hookArgs // arguments eventually passed to the hook - are mutable , lastArg = arguments[arguments.length-1] , pres = this._pres[name] , posts = this._posts[name] , _total = pres.length , _current = -1 , _asyncsLeft = proto[name].numAsyncPres , _next = function() { if (arguments[0] instanceof Error) { return handleError(arguments[0]); } var _args = Array.prototype.slice.call(arguments) , currPre , preArgs; if (_args.length && !(arguments[0] == null && typeof lastArg === 

so Wie muss ich mein Objekt iterieren?

+0

gute Antwort hier: http://stackoverflow.com/questions/14379274/javascript-iterate-object – snozza

+0

Ist 'Adresse 'ein' mongoose.Schema' und 'artist.address' ist eigentlich ein' mongoose.Document'? – mscdex

+0

nein, der Künstler ist ein mongoose.schema var artistSchema = mongoose.(Schema { Adresse: { Land: String, Zustand: String, Stadt: String, zip: String, Straße: String }, .... –

Antwort

4

Ebene JS verwenden, können Sie Object.keys

var obj = { 0: 'a', 1: 'b', 2: 'c' }; 
console.log(Object.keys(obj)); // console: ['0', '1', '2'] 

In Ihrem Beispiel

var artist = { address: { city: 'Tel Aviv' } }; 
Object.keys(artist.address).forEach(function(key){ 
    <%- artist.address[city] %> //key will city the output will be 'Tev Aviv' 
}); 

andere kühle Art und Weise zu verwenden lodash verwenden ist: lodash forEach

_([1, 2]).forEach(function(n) { 
    console.log(n); 
}).value(); 
+5

Dies beantwortet, wie man in Javascript iteriert, OP Titelfrage war, wie man iteriert mit EJS. Diese Antwort ist irreführend für diejenigen, die hier nach einer Antwort auf eine Frage im Titel suchen. – Cleanshooter

7

Sie sehen alle übernommenen Eigenschaften zusätzlich zu den "eigenen" Eigenschaften, die Sie oben hinzugefügt haben.

Es gibt zwei Möglichkeiten, dies zu lösen. Eine davon ist hasOwnProperty() zu verwenden, um Sie nicht vererbten Eigenschaften zu gewährleisten sehen:

<% for (var prop in artist.address) { 
    if (Object.prototype.hasOwnProperty.call(artist.address, prop)) { %> 
     <%- artist.address[prop] %> 
<% } 
    } %> 

Oder Object.keys() verwenden, die eine Reihe von nur nicht-vererbten Eigenschaften zurückgibt und iterieren, dass:

<% Object.keys(artist.address).forEach(function(prop) { %> 
    <%- artist.address[prop] %> 
<% }); %> 

Da es sich um mongoose verwandt, können Sie auch versuchen, über artist.address.toObject() (mit der öffentlichen API) oder artist.address._doc (mit einer privaten API) oder vielleicht eine Ebene auf dem artist Objekt.

+0

noch tun: <% Object.keys (Künstler .address) .forEach (function (prop) {%> <% - artist.address [prop]%> <% }); %> kehrt zurück: function() {return this.get (Pfad);} function() {return this.get (Pfad);} yafo 09988 –

+0

Was sind die Namen der unerwarteten Eigenschaften? – mscdex

2

OK, so dass ich in sie getaucht Hier ist eine Erklärung, Ich hatte ein Objekt:

address : { 
    country: String, 
    state: String, 
    city: String, 
    zip: String, 
    street: String 
} 

ich brauchte nur die Eigenschaften angezeigt werden und nicht einmal geerbt, so dass ich über das Objekt iterieren und bekam seine eigenen Eigenschaften:

<% Object.keys(artist.address).forEach(function(prop) { %> 
    // ["country" , "state" , "city" etc ] 
    <%- artist.address[prop] %> // so artist.address.state logs "New York City" 
<% }); %> 

aber das Problem war, dass mein artist.address Objekt zwei weitere Eigenschaften aufwies: jeder hält eine Funktion mit einer Rückkehr.

function() { return this.get(path); } function() { return this.get(path); } 

so geprüft i für Eigenschaften, die eine Zeichenfolge wie so gilt:

<% Object.keys(artist.address).forEach(function(prop) { 
    if(typeof artist.address[prop] == "string") { %> 
    <%- artist.address[prop] %> 
    <% } %> 
<% }); %> 
+0

Sie müssen herausfinden, wann Sie ejs Client oder Server verwenden möchten. wenn Sie es auf der Server-Seite mit und lässt seine ausdrückliche sagen: die Rückkehr Objekt sollte wie folgt aussehen: Controller: return res.render ('template/something.ejs', {_: require ('lodash '), Künstler: KünstlerDokument}); Ansicht Vorlage <% _ (artist.address) .forEach (function (prop) {%.><% - artist.address [Prop]%><% }); %> Client-Seite nur CDN-Dienst verwenden lodash