4

在我们的项目中,我们有几个改进列表,它们运行正常。但是它们是默认排序,计算字母数字,正在应用。在我们的情况下,我的每个优化列表项都有一个“等级”属性,但我无法访问它,因为 API 正在控制返回的内容。

根据文档,似乎只有三种排序选择。

有办法解决吗?

例如,此代码产生以下结果。

search.addWidget(
  instantsearch.widgets.refinementList({
    container: '#outsideDiameter',
    attributeName: 'outsideDiameter.description',
    operator: 'or',
    sortBy: ["name:asc"],
    limit: 5,
    showMore: true,
    templates: {
      header: getHeader('Outside Diameter'),
    },
  })
); 

在此处输入图像描述

我希望列表项按小数值升序排序。换句话说:3/16"、1/4"、5/16"、...、4.5mm、6.0mm 等...每个值都具有我之前提到的“等级”属性。

那可能吗?

4

1 回答 1

1

对于更高级的排序,有几个选项:

index.setSettings({
  renderingContent: {
    facetOrdering: {
      values: {
        size: {
          order: ['1/3"', '1/2"', '17m'],
          sortRemainingBy: 'hidden',
        },
      },
    },
  },
});
  • 将所有单位转换为公制(或其他正确排序的单位)并将其作为前缀添加到您的记录中:
{
  "size": "0015mm - 1/2\""
}

一旦你这样做,按字母顺序排序将具有升序。为了显示,您可以使用以下方法删除前导零:

refinementList({
  transformItems(items) {
    return items.map((item) => ({
      ...item,
      label: item.label.replace(/^0+/, ''),
    }));
  },
});
  • 使用 transformItems 排序

在 transformItems 中,您可以做任何您想做的事情,例如先转换单位,然后按该新属性排序:

refinementList({
  transformItems(items) {
    return items
      .map((item) => ({ ...item, mm: convertToMm(item.label) }))
      .sort((a, b) => b.mm - a.mm);
  },
});
于 2021-10-06T09:08:29.470 回答