2015-04-10 2 views
0

Я установил плагин Related для docpad, и я хочу, чтобы он отображал пять случайных сообщений в боковой панели каждого блога. На данный момент у меня его настроить таким образом, в моем post.html.jade:Рандомизировать связанные сообщения в Docpad

div 
    h4 Related posts: 
    each doc in getRelatedDocuments().slice(0,5) 
    a(href=doc.url)= doc.title 
    br 

Таким образом, он отображает 5 сообщений, но они не являются случайными. Как перетасовать вывод getRelatedDocuments()?

ответ

0

Благодаря Стиву Мак для указания меня в правильном направлении. Я в конечном итоге создать эту функцию в 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 

Так что теперь все здорово, спасибо!

+0

Я не продаюсь, является ли это лучшим способом для этого. Я вижу проблемы, если коллекция большая или большой объем веб-сайта. Было бы лучше, если бы это можно было сделать с помощью синтаксиса механизма запроса (https://learn.bevry.me/queryengine/guide) - но даже тогда вы захотите кэшировать результаты. –

+0

@SteveMc конечно, но как я могу использовать механизм запросов для получения сообщений с похожими тегами? Я не думаю, что это возможно. –

+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 

Может потребоваться дополнительный шаг в то время цикла, чтобы проверить, если значение документа уже находится в выходном массиве как Math .floor и т. д., возможно, вернет уже использованное значение.

Смежные вопросы