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

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


person Boaz Hoch    schedule 01.08.2015    source источник


Ответы (3)


используя простой 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();
person Doron Segal    schedule 03.08.2015
comment
Это отвечает на вопрос, как выполнять итерацию в Javascript, вопрос заголовка OP заключался в том, как выполнять итерацию с помощью EJS. Этот ответ вводит в заблуждение тех, кто пришел сюда в поисках ответа на вопрос в заголовке. - person Cleanshooter; 03.04.2017

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

Есть два способа решить эту проблему. Один из них — использовать 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] %>
<% }); %>

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

person mscdex    schedule 01.08.2015
comment
все еще делаю: ‹% Object.keys(artist.address).forEach(function(prop) {%› ‹%- artist.address[prop] %› ‹% }); %› возвращает: function () { return this.get(path); } функция () { вернуть this.get (путь); } яфо 09988 - person Boaz Hoch; 03.08.2015
comment
Как называются неожиданные свойства? - person mscdex; 03.08.2015

Итак, я углубился в это, вот объяснение, у меня был объект:

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] %>
  <% } %>
<% }); %> 
person Boaz Hoch    schedule 03.08.2015
comment
вам нужно выяснить, когда вы хотите использовать клиент или сервер ejs. если вы используете его на стороне сервера и скажем так: возвращаемый объект должен выглядеть так: контроллер: return res.render('template/something.ejs', { _: require('lodash'), artist: artistDocument }); шаблон просмотра ‹% _.(artist.address).forEach(function(prop){ %› ‹%- artist.address[prop] %› ‹% }); %› клиентская сторона просто использует службу cdn для получения lodash ‹script type=//cdn/lodash...› - person Doron Segal; 04.08.2015