1

我有如下所示的 JSON 对象:

[
    {
        "name": { "first": "John", "last": "Doe" }
    },
    {
        "name": { "first": "Foo", "last": "Bar" }
    }
]

我的 FuseJS 搜索选项是:

  var searchOpts = {
        shouldSort: true,
        threshold: 0.2,
        location: 0,
        distance: 100,
        maxPatternLength: 32,
        minMatchCharLength: 5,
        matchAllTokens: true,
        keys: [{
            name: "name.first", 
            weight: 0.3
        }, {
            name: "name.last",
            weight: 0.3
        }]
    }

我正在做的是获取用户输入的值并从包含所有人姓名的对象中搜索。

var fuse = new Fuse( peopleObj, searchOpts);
var result = fuse.search( query );

只要用户仅使用名字或姓氏进行搜索,一切都可以正常工作,但是如果他们例如键入“John Doe”,则不返回应该返回的对象,但如果他们只键入“John ”或“Doe”。

我可以通过简单地在对象内部设置另一个属性来实现这一点,"name": {"fullName": "John Doe"}但我对此并不满意,因为未来数据可能会变得更大,这只会浪费处理能力。

如何确保 FuseJS通过组合而不是单独搜索name.firstand属性。name.last我想matchAllTokens

4

1 回答 1

3

不幸的是,fusejs目前还没有提供跨多个键的搜索。

您可以按照该方法将所有感兴趣的键组合成一个键,例如

function combineAllKeyValues( obj, separator )
{
    separator = separator || " ";
    obj.all = Object.keys(obj.name).map(s=> obj.name[s]).join( separator );
    return obj;
}

演示

var peopleObj = [{
    "name": {
      "first": "John",
      "last": "Doe"
    }
  },
  {
    "name": {
      "first": "Foo",
      "last": "Bar"
    }
  }
];

var searchOpts = {
  shouldSort: true,
  threshold: 0.2,
  location: 0,
  distance: 100,
  maxPatternLength: 32,
  minMatchCharLength: 5,
  matchAllTokens: false,
  keys: [{
    name: "name.first",
    weight: 0.3
  }, {
    name: "name.last",
    weight: 0.3
  }, {
    name: "all",
    weight: 0.1
  }]
};

function combineAllKeyValues( obj, separator )
{
 separator = separator || " ";
 obj.all = Object.keys(obj.name).map(s=> obj.name[s]).join( separator );
 return obj;
}

peopleObj = peopleObj.map( s => combineAllKeyValues(s) );

var fuse = new Fuse( peopleObj, searchOpts);
var result = fuse.search( "John Doe" );

console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/fuse.js/3.0.4/fuse.min.js"></script>

于 2017-11-22T14:33:17.067 回答