フロントエンドに焦点を当てたインタビューでは、DSA がまったく考慮されないことがよくあります。
そして、学校や大学で DSA を勉強したことを覚えている人にとっては、すべての例が純粋にアルゴリズムのように感じられました (正当な理由があります)。しかし、私たちが毎日使用する製品がこの概念をどのように活用しているかについての例やガイダンスはほとんどありませんでした。
「これは必要になるでしょうか?」
このことをよく尋ねますよね? ?
React アプリで今すぐ利用できるデータ構造をいくつか紹介します。 ?
関連記事:
配列は React のいたるところにあります。 .map() または .filter() がどのように機能するかを理解するのに助けが必要な場合は、おそらくこの投稿が少し早すぎると思われます。ただし、心配しないでください。これらの配列メソッドに慣れると、リストのレンダリング、コンポーネントの状態の管理、データの変換にそれらがいかに重要であるかがわかります。
React アプリでユーザーや投稿などのエンティティの大規模なコレクションを扱う場合、データをオブジェクト (ハッシュ マップ) に正規化すると、読み取りと更新が大幅に効率化されます。深く入れ子になった構造を操作する代わりに、エンティティを ID によってマップします。
例: ID を持つ正規化されたストアからの読み取り
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}
このパターンにより、特にコレクション全体を再レンダリングせずに更新や読み取りを迅速に行う必要がある大規模なデータセットの場合に、効率的なデータ アクセスが可能になります。
二重リンク リストは、前と次の要素の両方から コンテキストが必要な場合に便利です。各画像が参照用に隣接する画像を表示する フォト ギャラリー に移動することを考えてください。インデックスを使用する代わりに、現在のノードをコンポーネントの状態に直接保存します。
例: コンテキストを持つ要素間のナビゲーションのための二重リンクリスト
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 && ( )}); }
この React コンポーネント内:
スタックを使用すると、後入れ先出し (LIFO) ロジックを使用して 元に戻す/やり直し 操作を効率的に管理できます。不変操作 (concat、slice) を使用することで、状態が変更されないままであることを保証できます。
例: 不変のプッシュとポップによる元に戻す/やり直し
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); } };
キューは 先入れ先出し (FIFO) 方式で動作し、API 呼び出しや通知などのタスクが正しい順序で処理されるようにするのに最適です。
例: 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 } };
ツリーは、コメント スレッド、フォルダー構造、メニューなどのネストされたコンポーネントを処理するときに React で一般的に使用されます。
例: コメント ツリーを再帰的にレンダリングする
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 => ())}
あなたに関連する可能性のある別の人気投稿:
例 1: 複数のビュー間のルーティング
ページ間のルートをグラフとして表すことができ、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}`); } }
例 2: ユーザー関係モデリング
グラフは、社会的つながり、または複数のエンティティが相互接続されているあらゆる種類の関係をモデル化するのに最適です。
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']
注: ミドルウェアにおけるレビュー担当者の依存関係を示すためにグラフを使用します。
これらの DSA クラスは昔は抽象的だと感じられたかもしれませんが、データ構造は React の周囲の世界を動かしています。
オブジェクト、スタック、キュー、リンク リスト、ツリー、グラフは単なる理論ではなく、毎日構築するクリーンで効率的でスケーラブルなアプリのバックボーンです。
次にキュー内の状態を管理したり、複雑な UI ロジックを処理したりするときは、学生時代からこのためのトレーニングをしてきたことを思い出してください。 ?
あなたが最もよく使用しているデータ構造を教えてください!
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3