Leaflet Search Filter только точные совпадения - PullRequest
0 голосов
/ 13 июля 2020

Я использую Leaflet Search and Fuse. js для поиска по нескольким слоям листовок и множеству свойств feature.properties в каждом из них. Наконец-то код заработал (но он действительно беспорядочный). Единственная проблема в том, что поскольку я использую filterData, он показывает ВСЕ маркеры, когда я ищу что-либо, а не точные совпадения.

Любой способ показать только точные совпадения?

var fuseOptions = {
  shouldSort: true,
  tokenize: true,
  threshold: 0,
  location: 0,
  maxPatternLength: 32,
  minMatchCharLength: 2,
  keys: ['properties.myKey']
};

    var fuse = new Fuse(city.features.concat(village.features.concat(gateway.features.concat(trade.features.concat(danger.features.concat(connect.features.concat(forest.features.concat(mine.features.concat(office.features.concat(farm.features.concat(fish.features.concat(annex.features)))))))))), fuseOptions), {
        keys: [
            'properties.name',
            'properties.prod1',
            'properties.extraprod1',
            'properties.extraprod2',
            'properties.extraprod3',
            'properties.extraprod4',
            'properties.extraprod5',
            'properties.buff',
            //'properties.operator'
        ]
    });
    L.control.search({
           initial: false,
           layer: allLayers,
           collapsed: false,
           casesensitive: false,
           propertyName: 'name',
           container: 'findbox',
       filterData: function(text, records) {
            var jsons = fuse.search(text),
                ret = {}, key;
            
            for(var i in jsons) {
                key = jsons[i].properties.name;
                ret[ key ]= records[key];
            }

            console.log(jsons,ret);
            return ret;
        }
    })
    .on('search:locationfound', function(e) {
        e.layer.openPopup();
    })
    .addTo(map);

1 Ответ

0 голосов
/ 13 июля 2020

Я не уверен, работает ли это, но попробуйте:

filterData: function(text, records) {
            var jsons = fuse.search(text),
                ret = {}, key;
            
            for(var i in jsons) {
                key = jsons[i].properties.name;
                if(key.startsWith(text)){
                    ret[ key ]= records[key];
                }
                // Try with and without this line
                else { rect[key] = null; }
            }

            console.log(jsons,ret);
            return ret;
        }
...