2017-12-18 139 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])); 

我取字符串分別使用兩個查詢,然後把他們的並集。

而在客戶端,您可以直接使用這些字符串來顯示搜索結果。