2015-08-01 3 views
8

У меня есть простой литерал объекта, который является адресом, как показано здесьEJS как перебрать объект

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

и его внутри объекта, который я передаю с express.js функции визуализации.

в моей странице шаблона я пытаюсь цикл внутри этого объекта, как показано ниже:

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

которые выводят данные, но включает в себя функции EJs, а вот так:

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 === 

так как мне нужно итерировать мой объект?

+0

хороший ответ здесь: http://stackoverflow.com/questions/14379274/javascript-iterate-object – snozza

+0

ли 'адрес 'на самом деле' mongoose.Schema' и 'artist.address' является' mongoose.Document'? – mscdex

+0

нет, художник - mongoose.schema var artistSchema = mongoose.Схема ({ адрес: { страна: String, состояние: String, город: String, застежка-молния: String, улица: String }, .... –

ответ

4

используя обычный JS вы можете использовать Object.keys

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

В вашем примере

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

Другой хороший способ заключается в использовании lodash: lodash forEach

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

Это ответы на вопрос о том, как итерации в Javascript, вопрос с заголовками OPs заключался в том, как итерации в с EJS. Этот ответ вводит в заблуждение для тех, кто привел сюда поиск ответа на вопрос в заголовке. – Cleanshooter

7

Вы видите все унаследованные свойства в дополнение к «собственным» свойствам, которые вы добавили сверху.

Существует два способа решить эту проблему. Одним из них является использование hasOwnProperty(), чтобы убедиться, что вы не видите наследуемые свойства:

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

Или использовать Object.keys(), который возвращает массив только ненаследуемых свойства и перебирать, что:

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

Поскольку это mongoose, вы также можете попробовать выполнить итерацию по artist.address.toObject() (используя общедоступный API) или artist.address._doc (используя частный API) или, возможно, до уровня на объекте artist.

+0

еще делать: <% Object.keys (художник .Address) .forEach (функция (проп) {%> <% - artist.address [проп]%> <% }); %> возвращается: функция() {вернуть this.get (путь);} функции() {return this.get (path);} yafo 09988 –

+0

Каковы имена неожиданных свойств? – mscdex

2

ОК, так что я нырнул в него вот объяснение, У меня был объект:

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

мне нужно, чтобы отобразить только те свойства и не наследуется один раз, так что я итерацию над объектом и получил свои собственные свойства:

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

но проблема заключалась в том, что мой artist.address объект имел еще два свойства: каждый имеет функцию с возвратом.

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

так я проверил для свойств, который содержит строку следующим образом:

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

вам нужно выяснить, когда вы хотите использовать ejs-клиент или сервер. , если вы используете его на стороне сервера и позволяет говорить о его экспресс: возвращение объект должен выглядеть следующим образом: контроллер: возвращение res.render («шаблон/something.ejs», {_: требуется ('lodash '), artist: artistDocument}); шаблон представления <% _ (artist.address) .forEach (функция (проп) {%.><% - artist.address [проп]%><% }); %> стороне клиента просто использовать ТПС сервис, чтобы получить lodash <тип скрипта = "// CDN/lodash ..."> –

Смежные вопросы