web-dev-qa-db-ja.com

ejsオブジェクトを反復する方法

ここに示すようなアドレスである単純なオブジェクトリテラルがあります

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

そしてその内部にあるオブジェクトは、express.jsレンダー関数で渡しています。

私のテンプレートページでは、次のようにこのオブジェクト内でforループを試みています。

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

それで、オブジェクトを反復する必要がありますか?

13
Boaz Hoch

プレーンな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' 
});

もう1つのクールな方法は、lodashを使用することです。 lodash forEach

    _([1, 2]).forEach(function(n) {
  console.log(n);
}).value();
7
Doron Segal

上に追加した「独自の」プロパティに加えて、継承されたすべてのプロパティが表示されます。

これを解決するには2つの方法があります。 1つは、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のレベルを反復することもできます。オブジェクト。

9
mscdex

わかりましたので、ここに飛び込みました説明です、オブジェクトがありました:

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オブジェクトには、さらに2つのプロパティがありました。それぞれのプロパティは、戻り値を持つ関数を保持しています。

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] %>
  <% } %>
<% }); %> 
3
Boaz Hoch