2017-05-04 8 views
1

나는 ~ 5000 개의 요소 목록을 가지고 있으며 사용자가 지정한 searchPhrase으로 필터링하고 싶습니다. 일반적으로 사용자는 필터링 구문의 첫 번째 문자를 입력 한 다음 두 번째와 세 번째를 입력합니다. 예를 들어 'a' 사용자 유형의 경우 'ab'이면 'abc'입니다.큰 목록의 성능 필터링

필터링 성능을 향상시키기 위해 reactjs/reselect 라이브러리를 사용하려고합니다. 그 구현에

export const getVisibleTodos = createSelector(
    [ getVisibilityFilter, getTodos ], 
    (visibilityFilter, todos) => { 
    switch (visibilityFilter) { 
     case 'SHOW_ALL': 
     return todos 
     case 'SHOW_COMPLETED': 
     return todos.filter(t => t.completed) 
     case 'SHOW_ACTIVE': 
     return todos.filter(t => !t.completed) 
    } 
    } 
) 

: :이 방법을 변경 한 Example : 나는 추가 정보에 예에서와 같이이 lib 디렉토리를 사용하고 난 그 때마다 눈치

export const getVisibleTodos = createSelector(
    [getSearchPhrase, getTodos], 
    (searchPhrase, todos) => { 
     return todos.filter((x) => { 
      return x.firstName.indexOf(searchPhrase) >= 0; 
     }); 
    } 
) 

때 사용자 유형 다음 편지 todos.length은 동일합니다. searchPhrase이 길면 todos.length을 더 짧게해서는 안됩니까? reactjs/reselect가없는 성능은 동일하다고 생각합니다.

이전 searchPhrase의 부분 문자열이 searchPhrase 일 때 todos 목록을 더 짧게 필터링 할 수 있습니까?

답변

1

재검색을 통해 성능을 향상시키는 방법이 아닙니다. 실제로 걸러 내기를 필터링 할 때 재검색 여부에 관계없이 동일한 시간이 소요됩니다.

당신이 필터링을 memoize하는 것입니다 위해 무엇을 재 선택 : 한 getSearchPhrase로와 (=== 평등에 의해 정의 된대로) getVisibleTodos 여러 번 한 번만 필터링을 수행 전화, 같은 값을 반환 getTodos.

이것은 복종 상태와 무관 한 변경 사항이 많은 복잡한 응용 프로그램에서 중요합니다. 상태를 변경하지 않으면 상태의 해당 부분이 변경되지 않아도 모든 선택기가 다시 실행됩니다.

+0

설명해 주셔서 감사합니다. 그래서 나는이 도서관의 특징을 오해했다. 유사한 상황에서 도움이되는 도서관을 만난 적이 있습니까? – Andrzej