2017-12-18 124 views
0

有数组中的一些对象是这样的:JS:对象价值取决于正则表达式匹配

const result = [ 
    { 
    "_id": "Dn59y87PGhkJXpaiZ", 
    "title": "Something", 
    "synonyms": [ "Anything", "else" ] 
    }, 
    { ... } 
] 

我通过执行该得到这样的结果:

Content.find({ 
    $or: [ 
    { title: { $regex: new RegExp(term, 'i') } }, 
    { synonyms: { $regex: new RegExp(term, 'i') } } 
    ] 
}).toArray() 

正如你所看到的,我通过给定的搜索词搜索标题(字符串)或同义词(数组)元素。 因此,搜索someany将给我第一份文件作为我的结果。

在我的组件我做数据的输出是这样的:

render() { 
    return result.map((link, index) => { 
    return <Dropdown.Item 
     text={link.title} 
     key={index} 
    /> 
    }) 
} 

但现在我得到了下拉项输出Something如果我在寻找any(项)。对于用户来说这没有意义。

当然any应该给我输出Anythingsome应该给我输出Something。 在这个例子中,您还可以搜索thing,我期望两个输出元素(单个结果文档的):AnythingSomething

我不太清楚如何修改代码来获得这个结果。我认为最好修改的地方应该是反应组件(输出) - 而不是服务器请求结果。

回答

0

您可以在服务器端发出两个单独的查询来清楚地说明文档的哪个部分已经匹配。这将确保对于使用同义词匹配的文档不用于返回标题。

const matchingTitles = Content.find(
    { title: { $regex: new RegExp(term, 'i') } } 
}, {title: 1}).toArray().map(x => x.title); 

const matchingSynonyms = Content.find(
    { synonyms: { $regex: new RegExp(term, 'i') } } 
}, {synonyms: 1}).toArray().map(x => x.synonyms).reduce((x, y) => x.concat(y), []); 

return Array.from(new Set([...matchingTitles, ...matchingSynonyms])); 

我取字符串分别使用两个查询,然后把他们的并集。

而在客户端,您可以直接使用这些字符串来显示搜索结果。