2016-04-20 72 views
5

我正在使用Algolia instantsearch.js在選舉中顯示候選人(此處爲https://laprimaire.org/candidats/)。我希望候選人的初始展示是隨機的,以便每個候選人都能獲得或多或少的相同的知名度。Algolia instantsearch.js:如何以隨機順序顯示結果?

我在這個答案讀,這不是Algolia的功能,但它有可能需要一點點JS伎倆也無妨:Is it possible to sort randomly, and to query on field if it exists?

問題是我使用instantsearch.js,我無法找到如何在instantsearch.js的情況下實現上述搜索功能。

我從instantsearch可以接收一個助手作爲參數searchFunction初始化文件看到: https://community.algolia.com/instantsearch.js/documentation/#initialization

但是卻沒有發現這個助手,以及如何處理它的文檔,讓我可以將隨機函數應用於搜索結果。

任何幫助將不勝感激! 非常感謝

Thibauld

+0

只是在這裏澄清一點,在[是否可以隨機排序,並在字段上查詢,如果存在?](http://stackoverflow.com/questions/33123488/is-it-possible-如果存在),那麼所涉及的JS將在同一頁面上將結果混合在一起。因此,如果您的結果列表分頁,我不確定這會實現您要查找的內容。 – Jerska

+0

看到您的網頁後,它似乎不是一個問題,但。 – Jerska

回答

6

命中部件有讓你獲得如何通過transformData.allItems and templates.allItems parameters顯示命中列表上的更多控制的一種方式。

使用這個問題How can I shuffle an array?shuffle方法:

function shuffle (o){ 
    for(var j, x, i = o.length; i; j = Math.floor(Math.random() * i), x = o[--i], o[i] = o[j], o[j] = x); 
    return o; 
} 

你可以簡單地做:

search.addWidget(
    instantsearch.widgets.hits({ 
    // Your other options 
    transformData: { 
     allItems: function (content) { 
     return { hits: shuffle(content.hits) }; 
     } 
    }, 
    templates: { 
     empty: 'No results', 
     allItems: '{{#hits}}<your previous templates.hit value>{{/hits}}' 
    } 
    }) 
); 

{{#hits}}{{/hits}}模板只是一些Hogan.js邏輯循環在你的每一個命中。

+0

太棒了!工作就像一個魅力:)非常感謝! – Thibauld