使用标题中的整数作为整数而不是Varchar在Algolia中对优化列表进行排序

时间:2019-01-10 03:26:06

标签: javascript algolia

我在{<1>}时以这种方式显示的Algolia 优化列表中有一组值:

enter image description here

如何将其显示为预期格式:

sortBy: ['name:asc']

(如果我能先获得“幼儿园”的所有其他值,那就更好了!)

这是我到目前为止的代码:

Grade 1
Grade 2
Grade 3
Grade 4
...
Grade 11
Grade 12

2 个答案:

答案 0 :(得分:0)

在窗口小部件选项中,可以为sortBy提供类似于Array.sort的功能

这意味着您可能会遇到类似的事情:

function sortGrades(a, b) {
  if (a.name == "Kindergarten") {
    return -1;
  } else if (b.name == "Kindergarten") {
    return 1;
  } else {
    return Number(a.name.match(/[0-9]+/)[0]) - Number(b.name.match(/[0-9]+/)[0]);
  }
}

search.addWidget(
    instantsearch.widgets.menu({
        // ...
        sortBy: sortGrades,
        // ...
     })
);

"Kindergarten"将始终排在第一位,而其他值将根据构面名称中的数字进行排序。

答案 1 :(得分:0)

我知道这是一个老问题,但我想我会分享我曾经在 refinementList 小部件中对一些奇怪命名的年龄组进行排序的方法。

function sortAges(a, b) {
  var ordering = {},
      sortOrder = ['0 - 6 months','0 - 1','2 - 5','6 - 8','9 - 11','12 - 17','18+','0-19','All ages'];
      
  for (var i=0; i<sortOrder.length; i++)
      ordering[sortOrder[i]] = i;

  return (ordering[a.name] - ordering[b.name]) || a.name.localeCompare(b.name);
}

用于:

instantsearch.widgets.refinementList({
    container: '#ages-list',
    attribute: 'ages',
    sortBy: sortAges
}),