Les entretiens axés sur le frontend ne se soucient souvent pas du tout du DSA.
Et pour ceux d'entre nous qui se souviennent d'avoir étudié le DSA à l'école/au collège, tous les exemples semblaient purement algorithmiques (pour une bonne raison), mais il n'y avait pratiquement aucun exemple ou guide sur la façon dont les produits que nous utilisons quotidiennement exploitent ce concept.
« Aurai-je un jour besoin de ça ? »
Vous avez souvent posé cette question, n'est-ce pas ? ?
Voici quelques structures de données que vous pouvez exploiter dans votre application React dès aujourd'hui ! ?
Lecture connexe :
Les tableaux sont partout dans React. Si vous avez besoin d’aide pour comprendre le fonctionnement de .map() ou .filter(), vous voyez probablement cet article un peu trop tôt ! Mais ne vous inquiétez pas : une fois que vous serez familiarisé avec ces méthodes de tableau, vous verrez à quel point elles sont essentielles pour le rendu des listes, la gestion des états des composants et la transformation des données.
Dans une application React, lorsque vous traitez un grand nombre d'entités telles que des utilisateurs ou des publications, la normalisation de vos données en objets (cartes de hachage) peut rendre la lecture et la mise à jour beaucoup plus efficaces. Au lieu de travailler avec une structure profondément imbriquée, vous mappez les entités par leurs identifiants.
Exemple : Lecture à partir d'un magasin normalisé avec des identifiants
const postsById = { 1: { id: 1, title: 'First Post', content: 'Content of first post' }, 2: { id: 2, title: 'Second Post', content: 'Content of second post' } }; const postIds = [1, 2]; function PostList() { return ({postIds.map(id => (); } function Post({ post }) { return ())} ); }{post.title}
{post.content}
Ce modèle permet un accès efficace aux données, en particulier avec les grands ensembles de données où les mises à jour ou les lectures doivent être effectuées rapidement sans restituer l'intégralité de la collection.
Les listes doublement liées sont utiles lorsque vous avez besoin de contexte à partir des éléments précédents et suivants : pensez à naviguer dans une galerie de photos où chaque image affiche ses images voisines pour référence. Au lieu d'utiliser un index, nous stockerons le nœud actuel directement dans l'état du composant.
Exemple : Liste doublement chaînée pour la navigation entre les éléments avec contexte
class Node { constructor(value) { this.value = value; this.next = null; this.prev = null; } } class DoublyLinkedList { constructor() { this.head = null; this.tail = null; } add(value) { const newNode = new Node(value); if (!this.head) { this.head = newNode; this.tail = newNode; } else { this.tail.next = newNode; newNode.prev = this.tail; this.tail = newNode; } } } const imageList = new DoublyLinkedList(); imageList.add({ id: 1, src: 'image1.jpg', alt: 'First Image' }); imageList.add({ id: 2, src: 'image2.jpg', alt: 'Second Image' }); imageList.add({ id: 3, src: 'image3.jpg', alt: 'Third Image' }); function Gallery() { const [currentNode, setCurrentNode] = useState(imageList.head); return ({currentNode.prev && ( )} {currentNode.next && ( )}); }
Dans ce composant React :
Stacks vous permet de gérer efficacement les opérations annuler/rétablir en utilisant la logique Dernier entré, premier sorti (LIFO). En utilisant des opérations immuables (concat, slice), nous pouvons garantir que l'état reste inchangé.
Exemple : Annuler/Rétablir avec push et pop immuables
const [undoStack, setUndoStack] = useState([]); const [redoStack, setRedoStack] = useState([]); const [formState, setFormState] = useState({ name: '', email: '' }); const updateForm = (newState) => { setUndoStack(prev => prev.concat([formState])); // Immutable push setRedoStack([]); // Clear redo stack setFormState(newState); }; const undo = () => { if (undoStack.length > 0) { const lastState = undoStack.at(-1); setUndoStack(prev => prev.slice(0, -1)); // Immutable pop setRedoStack(prev => prev.concat([formState])); // Move current state to redo setFormState(lastState); } }; const redo = () => { if (redoStack.length > 0) { const lastRedo = redoStack.at(-1); setRedoStack(prev => prev.slice(0, -1)); // Immutable pop setUndoStack(prev => prev.concat([formState])); // Push current state to undo setFormState(lastRedo); } };
Les files d'attente fonctionnent selon le principe Premier entré, premier sorti (FIFO) et sont idéales pour garantir que les tâches telles que les appels d'API ou les notifications sont traitées dans le bon ordre.
Exemple : Mise en file d'attente des appels d'API
const [apiQueue, setApiQueue] = useState([]); const enqueueApiCall = (apiCall) => { setApiQueue(prevQueue => prevQueue.concat([apiCall])); // Immutable push }; const processQueue = () => { if (apiQueue.length > 0) { const [nextCall, ...restQueue] = apiQueue; nextCall().finally(() => setApiQueue(restQueue)); // Immutable pop } };
Les arbres sont couramment utilisés dans React lorsqu'il s'agit de composants imbriqués tels que les fils de commentaires, structures de dossiers ou menus.
Exemple : Rendu d'une arborescence de commentaires de manière récursive
const commentTree = { id: 1, text: "First comment", children: [ { id: 2, text: "Reply to first comment", children: [] }, { id: 3, text: "Another reply", children: [{ id: 4, text: "Nested reply" }] } ] }; function Comment({ comment }) { return (); }{comment.text}
{comment.children?.map(child => ())}
Un autre article populaire qui pourrait vous intéresser :
Exemple 1 : Routage entre plusieurs vues
Vous pouvez représenter les itinéraires entre les pages sous forme de graphique, garantissant ainsi des chemins de navigation flexibles dans un SPA.
const routesGraph = { home: ['about', 'contact'], about: ['home', 'team'], contact: ['home'], }; function navigate(currentRoute, targetRoute) { if (routesGraph[currentRoute].includes(targetRoute)) { console.log(`Navigating from ${currentRoute} to ${targetRoute}`); } else { console.log(`Invalid route from ${currentRoute} to ${targetRoute}`); } }
Exemple 2 : Modélisation de la relation utilisateur
Les graphiques sont parfaits pour modéliser les connexions sociales ou tout type de relation dans laquelle plusieurs entités sont interconnectées.
const usersGraph = { user1: ['user2', 'user3'], user2: ['user1', 'user4'], user3: ['user1'], user4: ['user2'] }; function findConnections(userId) { return usersGraph[userId] || []; } console.log(findConnections('user1')); // Outputs: ['user2', 'user3']
Remarque : Nous utilisons des graphiques pour montrer les dépendances des réviseurs dans le middleware.
Ces classes DSA semblaient peut-être abstraites à l'époque, mais les structures de données alimentent le monde qui vous entoure dans React.
Les objets, les piles, les files d'attente, les listes chaînées, les arbres et les graphiques sont bien plus que de la simple théorie : ils constituent l'épine dorsale des applications propres, efficaces et évolutives que vous créez chaque jour.
Ainsi, la prochaine fois que vous gérerez l'état dans une file d'attente ou que vous gérerez une logique d'interface utilisateur complexe, rappelez-vous : vous vous êtes entraîné pour cela depuis l'école. ?
Faites-moi savoir quelles structures de données vous utilisez le plus !
Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.
Copyright© 2022 湘ICP备2022001581号-3