useSearch
is a custom React hook that provides autocomplete search functionality for an array of objects using the String2ObjectAutoCompleteSearch
class from the @neosh11/autocomplete-search
package. The hook filters the data based on a given search key and manages search text and filtered results internally.
Example -> Link
Function | Time |
---|---|
insert(word: string, id: string) |
O(m) , where m is the length of the word being inserted. |
findWords(prefix: string, maxCount?: number) |
O(k + n) , where n is the number of nodes, k is the lenght of the prefix |
We tested out a simple filter on 100,000 tokens on the browser and these were the results:
Method | Time (ms) |
---|---|
Simple filter | 467 |
autoCompleteSearch | 4 |
If you want your results to instantly load as you're typing with a lot of data, this library will be a life saver!
# if using yarn
yarn add autocomplete-search-react
# if using npm
npm install autocomplete-search-react
import { useSearch } from 'autocomplete-search-react';
const data = [
// your array of objects
];
const searchId = 'id'; // the property that will act as an ID
const searchKey = 'name'; // The property to search for in the objects
// or we can also use a function to map things
const searchFunction = (d) => d.title + d.description; // The property to search for in the objects
const maxResults = 10; // Maximum number of results to display
const tokeniser = ' '; // what to use to split the strings -> default is ' ', can be a RegExp
const [onTextChange, filteredObjects, searchText] = useSearch({
data: data
searchId: searchId;
searchKey: searchKey; // or function searchFunction
maxResults: maxResults;
tokenizer: tokeniser // or it can be regex - optional -> default is ' '
});
function App() {
const [onTextChange, filteredObjects, searchText] = useSearch({
data: data
searchId: 'id';
searchKey: 'name'; // or function searchFunction
maxResults: 10;
tokenizer: ', ' // or it can be regex - optional -> default is ' '
});
return (
<div>
<input
type="text"
value={searchText}
onChange={(e) => onTextChange(e.target.value)}
placeholder="Search"
/>
<ul>
{filteredObjects.map((item) => (
<li key={item.id}>{item.name}</li>
))}
</ul>
</div>
);
}
export default App;
This example demonstrates a simple search feature for a list of objects with name property. The search is case-insensitive and will display up to 10 results.