随机化 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

所以现在一切都很好,谢谢!