我已经安装了docpad的Related插件,我想要做的是我希望它在每个博文的侧边栏中显示五个随机相关的帖子。目前我已经在post.html.jade
:
div
h4 Related posts:
each doc in getRelatedDocuments().slice(0,5)
a(href=doc.url)= doc.title
br
所以,它显示了5个帖子,但它们不是随机的。如何随机播放getRelatedDocuments()
的输出?
答案 0 :(得分:1)
您是否尝试过对问题Getting random value from an array进行修改?
我在docpad.coffee文件中创建了一个函数来实现这个解决方案:
getRandomPosts: (howMany) ->
items = @getCollection('posts').toJSON()
output = []
i = 0
while i < howMany
doc = items[Math.floor(Math.random() * items.length)]
output.push(doc)
i++
return output
您可能需要在while循环中执行额外的步骤,以检查doc值是否已经在输出数组中,因为Math.floor等可能会返回已使用的值。
答案 1 :(得分:0)
感谢Steve Mc指出我正确的方向。我最终在docpad.coffee
:
shufflePosts: (items) ->
i = items.length
return items if i == 0
while --i
j = Math.floor(Math.random() * (i + 1))
tmp = items[i]
items[i] = items[j]
items[j] = tmp
return items
它基本上是Fisher-Yates混洗算法的实现。在我的帖子布局中,我称之为:
each doc in shufflePosts(getRelatedDocuments()).slice(0,5)
a(href=doc.url)= doc.title
br
所以现在一切都很棒,谢谢!