使用标题中的整数而不是 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
}),
我在 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
}),