Hone logo
Hone
Problems

Create a Custom useSet Hook in React with TypeScript

This challenge asks you to build a custom React hook, useSet, that mirrors the functionality of a Set but integrates seamlessly with React's re-rendering system. A useSet hook will manage a collection of unique values and trigger re-renders whenever the set is modified, ensuring your components stay synchronized with the set's state. This is useful when you need to track unique items and automatically update components that depend on that uniqueness.

Problem Description

You need to create a React hook called useSet that behaves like a JavaScript Set but is integrated with React's state management. The hook should:

  1. Initialize: Accept an optional initial array of values as an argument. This array will be used to populate the set upon initialization. If no initial array is provided, the set should be empty.
  2. add(value: T): Add a value to the set. If the value already exists, the set should remain unchanged. This method should trigger a re-render of any component using the hook.
  3. remove(value: T): Remove a value from the set. If the value doesn't exist, the set should remain unchanged. This method should trigger a re-render of any component using the hook.
  4. has(value: T): Check if a value exists in the set. Return true if the value is present, false otherwise.
  5. clear(): Remove all values from the set. This method should trigger a re-render of any component using the hook.
  6. Return Value: The hook should return an object with the following properties:
    • set: The current Set object.
    • add: The add function.
    • remove: The remove function.
    • has: The has function.
    • clear: The clear function.

Where T represents the type of values stored in the set.

Edge Cases to Consider:

  • Handling null or undefined values being added to the set.
  • Ensuring that the set only contains unique values.
  • Correctly triggering re-renders after each modification.
  • Handling the initial array correctly, avoiding infinite loops during initialization.

Examples

Example 1:

Input: Initial array: [1, 2, 2, 3]
Output: set: Set(3) { 1, 2, 3 }
Explanation: The hook initializes with the unique values from the input array. Duplicate values are automatically removed.

Example 2:

Input:  Calling add(4), then remove(2)
Output: set: Set(3) { 1, 3, 4 }
Explanation: Adding 4 adds it to the set. Removing 2 removes it from the set.

Example 3:

Input: Calling clear() after adding 1, 2, and 3
Output: set: Set(0) {}
Explanation: The clear() function removes all elements from the set, resulting in an empty set.

Constraints

  • The hook must be written in TypeScript.
  • The hook must correctly trigger re-renders of components using it whenever the set is modified.
  • The hook should be performant; avoid unnecessary re-renders or complex operations.
  • The set object returned should be a standard JavaScript Set object.
  • The hook should handle any data type as the value type T.

Notes

  • Consider using useState to manage the set's internal state.
  • Think about how to efficiently update the set and trigger re-renders.
  • Pay close attention to immutability when modifying the set. Directly mutating the set will not trigger re-renders.
  • The has method should be a simple check against the underlying Set object.
  • The initial array, if provided, should be processed to ensure only unique values are added to the set during initialization.
Loading editor...
typescript