未在javascript/ejs中定义对象键

nfs0ujit  于 2021-10-10  发布在  Java
关注(0)|答案(2)|浏览(471)

此问题已在此处找到答案

循环。为什么小于<不小于或等于<=((四个答案)
昨天关门了。
我有一个名为posts的数组,它包含一个对象:

  1. var posts = []
  2. app.get('/', function(req, res) {
  3. res.render('home', {
  4. homestct: homeStartingContent,
  5. posts: posts
  6. })
  7. })
  8. app.post('/compose', function(req, res) {
  9. const comp = {
  10. title: req.body.compTitle,
  11. post: req.body.compPost
  12. }
  13. posts.push(comp)
  14. res.redirect('/')
  15. })

当我试图在home.ejs中检索关键字:title时=

  1. <% for (var i = 0; i <= posts.length; i++) { %>
  2. <% console.log(posts[i].title) %>
  3. <% } %>

它给了我一个错误:无法读取未定义的属性“title”
请帮忙

ajsxfq5m

ajsxfq5m1#

  1. <% for (var i = 0; i < posts.length; i++) { %>
  2. ``` `i` 应小于 `posts.length` . 代替 `<=` 具有 `<` .
fslejnso

fslejnso2#

你的错误是你有 <= 而不是 < . 让我举例说明原因。
假设您的posts数组如下所示:

  1. [
  2. { title: 'A', post: 'a' }, // This will be posts[0]
  3. { title: 'B', post: 'b' } // This will be posts[1]
  4. ]

你有两个帖子,所以 posts.length2 . 第一个帖子是 posts[0] ,第二个帖子是 posts[1] .
既然你这么做了 for (var i = 0; i <= posts.length; i++) ,这意味着您的循环只有在 i <= posts.length 不再是真的,意思是如果 i <= 2 不再是真的,即当 i 达到 3 ,循环将停止,但将针对 0 , 12 .
您可能会注意到,现在这意味着可以访问三个索引( 0 , 12 )尽管数组中只有两个帖子(带索引 01 )!
在第三次迭代中,您将访问 posts[2] 那是 undefined . 这意味着尝试读取 posts[2].title 失败,因为它实际上尝试读取 undefined.title 这是不可能的,因此出现了错误 Cannot read property 'title' of undefined .
底线:当你有一个从零开始的索引(从 0 )您可以将元素的总数作为限制器(从 .length 例如),您始终需要使用 < 而不是 <= 确保停止长度不足的一个索引,因为最后一个索引将始终为 length - 1 .
建议:您可以使用 for ... of :

  1. <% for (const post of posts) { %>
  2. <% console.log(post.title) %>
  3. <% } %>
展开查看全部

相关问题