随机化 Docpad 中的相关帖子
Randomize related posts in Docpad
我已经为 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()
的输出?
您是否尝试过对问题 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 等可能 return 一个值已经被使用。
感谢 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 洗牌算法的一个实现。在我的 post 布局中,我使用以下方式调用它:
each doc in shufflePosts(getRelatedDocuments()).slice(0,5)
a(href=doc.url)= doc.title
br
所以现在一切都很好,谢谢!
我已经为 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()
的输出?
您是否尝试过对问题 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 等可能 return 一个值已经被使用。
感谢 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 洗牌算法的一个实现。在我的 post 布局中,我使用以下方式调用它:
each doc in shufflePosts(getRelatedDocuments()).slice(0,5)
a(href=doc.url)= doc.title
br
所以现在一切都很好,谢谢!