Как установить параметры fuse.js

const JSON = [
  {
    "name": "01,02"
  },
  {
    "name": "01"
  },
  {
    "name": "05"
  },
  {
    "name": "06,09"
  },
  {
    "name": "04,05"
  },
  {
    "name": "02,03"
  },
  {
    "name": "02,04,05"
  },
  {
    "name": "01,02"
  },
  {
    "name": "01,03"
  }
]


function foo (str) {
  const options = {
    keys: ['name'],
    threshold: 0,
    location: 0,
    distance: 100,
    minMatchCharLength: str.length
  }
  const _fuse = new Fuse(JSON, options)
  console.log(_fuse.search(str))
}

foo('03')
<script src="https://cdnjs.cloudflare.com/ajax/libs/fuse.js/3.2.1/fuse.min.js"></script>

Я пытаюсь использовать fuse.js для фильтрации. Я не уверен, как использовать параметры. Если я ищу с 03 Я не возвращаю никаких результатов. Я попытался изменить местоположение и порог, но не полностью понял это. Я установил minMatchCharLength на длину строки запроса, думая, что предотвратит запрос 01 от возврата предметов, которые содержат только 0, Это верно?

3 ответа

Ваш код уже в порядке. Вы устанавливаете порог на 0 что значит

fuse requires a perfct match (of both letters and location)

И нет name свойство, которое точно 03,

Так что, если вы возитесь только с порогом и установите его в 0.2 например - вы получите некоторые результаты поиска:

[{name: "02,03"}, {name: "01,03"}]

Сthreshold: 0, ваше имя должно точно соответствовать как местоположению, так и содержимому, поэтому поиск по запросу «03» будет возвращать только элементы, начинающиеся с «03».

Если вы хотите сохранить точное соответствие, но хотите, чтобы строка поиска находилась в любом месте имени, начиная с Fuse 6.2.0, вы теперь можете использовать параметр ignoreLocation . Согласно документам:

Если это правда, поиск будет игнорировать местоположение и расстояние, поэтому не имеет значения, где в строке появляется шаблон.

Итак, ваши параметры примера будут выглядеть так:

      // ...  
const options = {
    keys: ['name'],
    threshold: 0,
    ignoreLocation: true,
    location: 0,
    distance: 100,
    minMatchCharLength: str.length
}
// ...

Это лучшая альтернатива предыдущим подходам, где вам приходилось использовать высокиеdistanceи низкий, но ненулевойthreshold

Попытаться изменить "name" в name:

const JSON =  [
  {
    name: "01,02"
  },
  {
    name: "01"
  },
  {
    name: "05"
  },
  {
    name: "06,09"
  },
  {
    name: "04,05"
  },
  {
    name: "02,03"
  },
  {
    name: "02,04,05"
  },
  {
    name: "01,02"
  },
  {
    name: "01,03"
  }
];

Здесь вы можете найти демо, которое позволяет вам "играть" с конфигурациями. Вы можете вставить свой JSON и попытаться получить разные результаты: Ссылка

Для получения дополнительной информации о конфигурации вы можете обратиться к шагу 2 предыдущей ссылки, которая объясняет все параметры. Например: порог: в какой момент отказывается алгоритм сопоставления. Порог 0.0 требует идеального соответствия (как букв, так и местоположения), порог 1.0 будет соответствовать чему угодно

Вот демо с вашим примером: jsfiddle

Другие вопросы по тегам