数组按索引输出返回undefined

时间:2015-07-27 16:17:45

标签: javascript arrays json node.js ejs

我正在尝试输出位于json对象中的数组的特定索引。

例如,我从MongoDB中获取了以下json对象

{ _id: 55b65199c92d15d80fd94803,
  site: 'test.com',
  company: 'test',
  __v: 0,
  votes: [
     { vote_user: '55a11de3e4c770982730ccb9' },
     { vote_user: '55a11de3e4c770982730612a' } 
  ] 
}

此对象从nodejs route render传递为名为suggestion的对象,并通过EJS循环使用

 <% suggestion.forEach(function(item){ %><%}%>

在这个阶段,我尝试使用

从投票数组中检索特定的vote_user对象
 <% suggestion.forEach(function(item){ %><%- item.votes[0] %><%})%>

但是,我得到的只是 undefined

我尝试将'item'分配给一个javascript变量,然后将其记录到浏览器控制台,它完全符合我的要求并期望它 - 就像我得到以下结果一样:

Object {vote_user: "55a11de3e4c770982730ccb9"}

真的无法解决为什么它不起作用,因为我认为。

修改

由于有点不清楚设置如何,这里是使用的实际代码:

EJS

<% suggestion.forEach(function(item, i){ %>
        <div class="suggestion-entry suggestion-<%- item._id %>" data-entry="<%- item._id %>">
            <!--<%- item %>-->
            <div class="entry-info">
                <div class="voting">
                    <script>
                        console.log(<%- item.votes %>[0].vote_user)
                    </script>
                    <%- item.votes[0].vote_user %>
                    <div class="vote vote-up"><a><i class="fa fa-chevron-up"></i></a></div>
                <div class="vote vote-down"><a><i class="fa fa-chevron-down"></i></a></div>
                </div>
                <div class="image"><img src='http://placehold.it/130x90.jpg'></div>
                <div class="company">
                    <h2><a href="<%= item.site %>"><%= item.company %></a></h2>
                    <span class="desc"><%= item.company %></span>
                </div>
            </div>
        </div>
    <% }); %>

脚本标记输出实际的vote_user值而不是undefined。

Nodejs route

app.get('/', function(req, res) {
        Suggestion.find(function(err, suggestions){
            res.render('index', { message: req.flash('message'), title: "title", user : req.user, suggestion : suggestions });
        })
    });

MongoDB文档在开头写的

2 个答案:

答案 0 :(得分:0)

回答问题的答案:

首先,您的id需要是一个字符串。似乎问题在于使用<%-标签。也许你可以找到关于它应该如何工作但在网站上进行测试的文档,在<%=完美运行时根本不起作用。剥夺了概念证明:

<%
var suggestion = [{ _id: '55b65199c92d15d80fd94803',
  site: 'test.com',
  company: 'test',
  __v: 0,
  votes: [
     { vote_user: '55a11de3e4c770982730ccb9' },
     { vote_user: '55a11de3e4c770982730612a' } 
  ] 
}];
%>

<% suggestion.forEach(function(item, i){ %>
<div class="suggestion-entry suggestion-<%= item._id %>" data-entry="<%= item._id %>">
  <li><%= item.votes[0].vote_user %></li>
  <li><%= item.site %></li>
  <li><%= item.company %></li> 
</div>
<% }); %>

将其粘贴到网站上的测试文本区域中,您将看到它的工作原理。如果这仍然无法使用您的代码,那么会发生一些完全不同的事情。

答案 1 :(得分:0)

所以,我终于设法解决了这个问题 - 我不确定为什么这个解决方案有效,但它确实有效。

根据@Jan的建议,id必须转换为字符串,以使EJS能够正确验证和使用json对象。

解决方案是首先对从节点

传递的json对象进行字符串化
app.get('/', function(req, res) {
    Suggestion.find(function(err, suggestions){
        res.render('index', { message: req.flash('message'), title: "title", user : req.user, suggestion : JSON.stringify(suggestions) });
    })
});

这会将所有对象和数组作为字符串返回,而不是为mongo中的值设置的数据类型。

为了能够使用字符串值,我在EJS中只是将字符串化的建议变量解析为JSON with

JSON.parse(suggestion)