Javascript 使用一个搜索查询搜索两个属性

Javascript 使用一个搜索查询搜索两个属性,javascript,fuse.js,Javascript,Fuse.js,我有JSON对象,看起来像这样: [ { "name": { "first": "John", "last": "Doe" } }, { "name": { "first": "Foo", "last": "Bar" } } ] 我的FuseJS搜索选项是: var searchOpts = { shouldSort: true, threshold: 0.2, location

我有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.first
name.last
属性来搜索它们。我原以为
matchAllTokens

不幸的是,fusejs到目前为止没有提供跨多个键的搜索

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

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

var peopleObj=[{
“姓名”:{
“第一”:“约翰”,
“last”:“Doe”
}
},
{
“姓名”:{
“第一个”:“Foo”,
“last”:“Bar”
}
}
];
var searchOpts={
应该排序:是的,
阈值:0.2,
地点:0,
距离:100,
最大模式长度:32,
minMatchCharLength:5,
matchAllTokens:false,
关键点:[{
姓名:“姓名。第一”,
重量:0.3
}, {
姓名:“姓名,最后一次”,
重量:0.3
}, {
名称:“全部”,
重量:0.1
}]
};
函数组合LKEYVALUES(obj,分隔符)
{
分隔符=分隔符| |“”;
obj.all=Object.keys(obj.name).map(s=>obj.name[s]).join(分隔符);
返回obj;
}
peopleObj=peopleObj.map(s=>combineAllKeyValues);
var fuse=新保险丝(peopleObj、searchOpts);
var result=fuse.search(“John Doe”);
控制台日志(结果)

我明白了。似乎这是目前唯一一种使用FuseJS的方法。谢谢你的解决方案!我没有看到这种行为——至少在最新版本的库中没有:)