ejs如何迭代对象

Posted

技术标签:

【中文标题】ejs如何迭代对象【英文标题】:ejs how to iterate object 【发布时间】:2015-10-24 05:13:43 【问题描述】:

我有一个简单的对象字面量,它是这里显示的地址

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

那么我需要如何迭代我的对象?

【问题讨论】:

这里的好答案:***.com/questions/14379274/javascript-iterate-object address 实际上是 mongoose.Schemaartist.addressmongoose.Document 不,艺术家是 mongoose.schema var artistSchema = mongoose.Schema( address: country: String, state: String, city: String, zip: String, street: String , . ... 【参考方案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] %>
<% ); %>

由于这与 mongoose 相关,您还可以尝试迭代 artist.address.toObject()(使用公共 API)或 artist.address._doc(使用私有 API),或者在 artist 对象上升级。

【讨论】:

还在做: 正在返回:function () return this.get(path); function () return this.get(path); yafo 09988 意外属性的名称是什么?【参考方案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] %>
  <%  %>
<% ); %> 

【讨论】:

你需要弄清楚你什么时候想使用ejs客户端或服务器。如果您在服务器端使用它并说它的表达:返回对象应如下所示:控制器:return res.render('template/something.ejs',_:require('lodash'),艺术家:artistDocument );查看模板 客户端只需使用cdn服务获取lodash 【参考方案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();

【讨论】:

这回答了如何在 Javascript 中进行迭代,OP 的标题问题是如何使用 EJS 进行迭代。对于那些被带到这里来寻找标题问题答案的人来说,这个答案会产生误导。

以上是关于ejs如何迭代对象的主要内容,如果未能解决你的问题,请参考以下文章

在 ejs 部分中迭代 JSON 对象

如何在 ejs 中将对象作为函数参数发送

如何使用 express .node 、 mongoose 和 ejs 删除对象

如何将日期格式从对象的猫鼬数组更改为 ejs 视图上的字符串?

Express EJS模板如何传递一个json对象来查看它是不是未定义

ejs 获取嵌套对象