Как установить параметры 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