2017-12-18 1 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() 

당신이 볼 수 있듯이을, I 주어진 검색 용어로 제목 (문자열) 또는 동의어 (배열) 요소를 검색합니다. some 또는 any을 검색하면 내 문서가 내 결과로 표시됩니다.

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

을하지만 지금은 내가 any (용어) 찾고 있어요 경우 드롭 다운 항목의 출력 Something을받을 수 있나요 : 내 구성 요소에서

나는이 같은 데이터의 출력을한다. 사용자에게 이것은 의미가 없습니다.

물론 any 출력은 Anything이고 some 출력은 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])); 

두 개의 쿼리를 사용하여 문자열을 개별적으로 반입 한 다음 해당 합집합을 취합니다.

그리고 클라이언트 측에서 이러한 문자열을 직접 사용하여 검색 결과를 표시 할 수 있습니다.

관련 문제