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

Sorting a Refinement List in Algolia Using Integers in Title as Integers, not Varchar

我在 Algolia 优化列表 中有一组值,当我 sortBy: ['name:asc']:

我怎样才能让它以预期的格式显示:

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

(如果我能在所有其他值之前先得到 'Kindergarten' 就更好了!)

这是我目前的代码:

search.addWidget(
    instantsearch.widgets.menu({
        container: '#grade_menu',
        attribute: 'grades_JSON.long',
        sortBy: ['name:asc'],
        limit: 13,
        cssClasses: {
            showMore: 'btn-dark',
            count: 'tiny-text',
        },
        templates: {
            item: `
                <li class="nav-item pl-0 ml-0">
                <a class="nav-link" href="@{{slug}}">
                <span class="@{{cssClasses.label}}">@{{label}}</span>
                <span class="@{{cssClasses.count}}">
                @{{#helpers.formatNumber}}@{{count}}@{{/helpers.formatNumber}}
                </span>
                </a>
                </li>
            `,
        },
     })
);

在您的小部件选项中,sortBy can be given a function that behaves like 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" 将始终排在第一位,而其他值将根据构面名称中的数字进行排序。

我知道这是一个老问题,但我想我会分享我用来在 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
}),