未在javascript/ejs中定义对象键

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

此问题已在此处找到答案

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

var posts = []

app.get('/', function(req, res) {
    res.render('home', {
        homestct: homeStartingContent,
        posts: posts
    })
})

app.post('/compose', function(req, res) {
    const comp = {
        title: req.body.compTitle,
        post: req.body.compPost
    }
    posts.push(comp)
    res.redirect('/')

})

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

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

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

ajsxfq5m

ajsxfq5m1#

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

fslejnso2#

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

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

你有两个帖子,所以 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 :

<% for (const post of posts) { %>
        <% console.log(post.title) %>
    <% } %>

相关问题