2017-05-04 35 views
1

我有一個〜5000個元素的列表,我想通過用戶給出的searchPhrase進行過濾。 通常用戶鍵入過濾短語的第一個字母,然後是第二個,然後是第三個。 例如,用戶類型'a',然後'ab',然後'abc'使用大型列表過濾性能

我正在嘗試使用reactjs/reselect庫來提高過濾性能。 我已經使用這個LIB如實施例上自述: Example 我已經改變這個方法:

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) 
    } 
    } 
) 

該實現:

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的性能是相同的。

是否有可能過濾較短的todos列表當前searchPhrase是實際的子串searchPhrase

回答

1

這不是如何重新選擇提高性能:實際的todos過濾需要完全相同的時間,無論是否重新選擇。

重新選擇什麼爲你做是爲了memoize的過濾:只要getSearchPhrasegetTodos返回相同的值(由===平等的定義),要求getVisibleTodos多次做過濾一次。

這對於一個複雜的應用程序很重要,在這個應用程序中,您有許多與redux狀態無關的更改:如果不重新選擇狀態的任何更改,將導致所有選擇器再次運行,即使狀態的該部分未更改。

+0

感謝您的解釋。所以我誤解了這個庫的功能。你有沒有遇到過類似的情況下可以幫助你的圖書館? – Andrzej