【问题标题】:Loop through JSON in EJS在 EJS 中循环 JSON
【发布时间】:2014-05-22 00:50:32
【问题描述】:

我在下面的 EJS 中有代码,

<script>
    var row =<%-JSON.stringify(data)%>
    console.log(row);
</script>
<% for(var i=0; i<JSON.stringify(data).length; i++) {%>
   <tr>
     <td>
       <%= JSON.stringify(data)[i].id%>
     </td>
   </tr>
<% } %>

行的输出是正确的,一个由 3 个对象组成的数组,每个对象都有属性 id、name 等。我可以操纵行以在 JS 中填充表格。但是,我想知道是否有办法允许以上述方式完成?

当我运行上面的代码时,JSON.stringify(data).length 不是 3,而是整个字符串的长度。

另一个问题是当我尝试添加时

或 ,它给了我“未定义”错误...

帮助表示赞赏。

问候 锤子

【问题讨论】:

  • 在您的 for 循环中,您可以只引用 data,因为它正在服务器上进行操作(即您希望将其作为真实对象而不是字符串进行操作)。关于第二个问题,alertwindow 是特定于浏览器的,不是 n 节点。
  • 谢谢巴里。在 EJS 中是否可能,我在

标签: node.js ejs


【解决方案1】:

JSON.stringify 返回一个String。所以,例如:

var data = [
    { id: 1, name: "bob" },
    { id: 2, name: "john" },
    { id: 3, name: "jake" },
];

JSON.stringify(data)

将返回等价于:

"[{\"id\":1,\"name\":\"bob\"},{\"id\":2,\"name\":\"john\"},{\"id\":3,\"name\":\"jake\"}]"

作为String 值。

所以当你有

<% for(var i=0; i<JSON.stringify(data).length; i++) {%>

最终的样子是:

<% for(var i=0; i<"[{\"id\":1,\"name\":\"bob\"},{\"id\":2,\"name\":\"john\"},{\"id\":3,\"name\":\"jake\"}]".length; i++) {%>

这可能不是你想要的。您可能确实想要的是这样的:

<table>
<% for(var i=0; i < data.length; i++) { %>
   <tr>
     <td><%= data[i].id %></td>
     <td><%= data[i].name %></td>
   </tr>
<% } %>
</table>

这将输出下表(使用上面的示例data):

<table>
  <tr>
    <td>1</td>
    <td>bob</td>
  </tr>
  <tr>
    <td>2</td>
    <td>john</td>
  </tr>
  <tr>
    <td>3</td>
    <td>jake</td>
  </tr>
</table>

【讨论】:

  • 您好!这是对的。但是如何用 html 渲染的页面而不是 ejs 做同样的事情??
  • @SPnL 那是不可能的。使用 EJS,您可以在渲染发生之前使用 JS 代码。
【解决方案2】:

在我的例子中,datas 是 Array 的一个对象,更多信息请Click Here

<% for(let [index,data] of datas.entries() || []){  %>
 Index : <%=index%>
 Data : <%=data%>
<%} %>

【讨论】:

  • 请在您的答案中添加一些解释,以便其他人可以从中学习
  • 感谢您的评论。我已经编辑了代码,请通过它。
【解决方案3】:

JSON.stringify(data).length 返回字符串长度不是Object长度,可以使用Object.keys。

<% for(var i=0; i < Object.keys(data).length ; i++) {%>

https://stackoverflow.com/a/14379528/3224296

【讨论】:

    【解决方案4】:

    我在选择上创建动态选项的方式是:

    <optgroup label="Select Table">
        <% for(var i=0; i<doctors.length; i++) {%>
            <% fullname = doctors[i].surname + doctors[i].name %>
            <option name="doctor" value=" <%= fullname%> "><%= fullname%></option>
        <% } %>
    </optgroup>
    

    我已经从响应中发送了数据,我只是用 for 循环对其进行迭代。

    【讨论】:

      【解决方案5】:

      这种东西你可以试试。不需要你需要使用Dbjson,只是语法参考

      const codifyOptions = codifier.DatabaseCodifyOptions
      const databaseOptions = databasifier.SqlServerDatabaseOptions
      const dbJson = databasifier.getDatabaseJson(project, codifyOptions, databaseOptions)
      
      dbJson.tables.forEach(table => {
      
        const tableName = codifier.codifyText(
              table.domain ? table.domain.concat("_", table.name) : table.name,
              codifyOptions 
        
        )
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-09-14
        • 2020-07-13
        • 2017-06-18
        • 1970-01-01
        • 2018-06-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多