๋ฌธ์
ํธ๋ฆฌ๊ตฌ์กฐ ๋ฐ์ดํฐ
interface Data {
id: string;
children: Data[];
}
export const data: Data = {
id: "์์1",
children: [
{
id: "ํ์1",
children: [
{ id: "ํ์1-1", children: [{ id: "ํ์1-1-1", children: [] }] },
{ id: "ํ์1-2", children: [] },
],
},
{ id: "ํ์2", children: [] },
],
};
ํ์ฌ ํด๋ฆญํ๋ ์์ดํ
์ id๋ ์ํ๊ฐ์ผ๋ก ๊ด๋ฆฌํ๊ณ ์๋ค. ํด๋น ์์ดํ
์ ๋๋ฅด๋ฉด id ์ํ๊ฐ์ด ๋ฐ๋ก ๋ณ๊ฒฝ๋๋ค.
const [currentId, setCurrentId] = useState(data.id);
๊ทธ ๋ณ๊ฒฝ๋ id๋ฅผ ๊ฐ์ง๊ณ ํธ๋ฆฌ ๊ตฌ์กฐ์ ๋ฐ์ดํฐ์์ ํด๋น id๊ฐ์ ๊ฐ์ง๊ณ ์๋ ์์ดํ
์ ์ฌ๊ทํจ์๋ฅผ ์ด์ฉํด์ ์ฐพ๋๋ค.
ํธ๋ฆฌ๊ตฌ์กฐ ๋ฐ์ดํฐ์ ๊ฒฝ์ฐ ์ฌ๊ทํจ์๋ฅผ ์ด์ฉํ๋ฉด id ๊ฐ๋ง ๊ฐ์ง๊ณ ํด๋น ๋ฐ์ดํฐ ์์ฒด๋ฅผ ์ฐพ์ ๋ชจ๋ ์์ฑ๊ฐ์ ๊ฐ์ ธ์ฌ ์ ์์ด ์ ์ฉํ๋ค.
//์ฌ๊ทํจ์
const findItemByCurrentId = (data: Data, currId: string) => {
//base case
if (data.id === currId) {
return data;
}
//recursive case
if (data.children.length > 0) {
for (const item of data.children) {
const foundItem = findItemByCurrentId(item, currId);
if (foundItem) {
return foundItem;
}
}
}
};
์ด์์ฌํญ
์ฌ๊ทํจ์๋ก ์ฐพ์ ํ์ฌ ์์ดํ
๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํด currentItem์ด๋ผ๋ ์ํ๊ฐ์ ํ๋ ๋ ๋ง๋ค์ด์ผ ๋๋ค๊ณ ์๊ฐํ๋ค.
๊ทธ๋ฆฌ๊ณ useEffect ํ
์ ์ฌ์ฉํด์ ํ์ฌ id์ธ currentId๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง๋ค setCurrentItem ํจ์๋ก ์๋กญ๊ฒ ์ฌ๊ทํจ์๋ก ์ฐพ์ ์์ดํ
๋ฐ์ดํฐ๋ฅผ ์ํ๋ก ์ ์ฅํ๋ค.
const [currentItem, setCurrentItem] = useState<Data>();
useEffect(() => {
setCurrentItem(findItemByCurrentId(data, currentId));
}, [currentId]);
console.log(currentItem);
๊ทธ๋ฐ๋ฐ ์ด ๊ฒฝ์ฐ ์ฝ์์ ๊ธฐ์กด ์์ดํ
๊ณผ ์๋ก์ด ์์ดํ
์ด ๋์์ ์ฐํ๋ค.
ํ์2์ ์๋ค๊ฐ ํ์1-2๋ฅผ ๋๋ฅด๋ฉด, ๊ธฐ์กด ํ์2๊ฐ ์ฐํ๊ณ ๋์์ ๋ฐ๋ก ์ด์ด์ ํ์1-2๊ฐ ์ฐํ๋ ๋ฌธ์ ์๋ค.
๊ฒฐ๊ตญ ํ์ฌ ํด๋ฆญํ id ์ํ๊ฐ์ด ๋ฐ๋๋ฉด์ ํ๋ฉด์ด ์ฌ๋ ๋๋ง๋๋ ๊ฒ์ธ๋ฐ, ์ฌ๊ทํจ์ ํธ์ถ์ด ๋๊ธฐ ์ด์ ์ ์ ์ฅ๋์ด์๋ ๊ธฐ์กด ์์ดํ
์ด ๋ ๋๋ง๋๊ณ , ์ฐ์ฐ์๊ฐ์ด ๋น๊ต์ ์์๋๋ ์ฌ๊ทํจ์ ํธ์ถ์ด๋๊ณ ๋ ํ์ ์๋ก์ด ์์ดํ
์ด ์ํ๋ก ์๋ก ์ ์ฅ๋๊ณ ๋ ๋ค์ ๋ ๋๋ง๋๋ ๊ฒ์ด๋ผ๊ณ ์ดํดํ๋ค.
ํด๊ฒฐ
๊ทธ๋ ๋ค๋ฉด ์ฐ์ฐ์ ์ฝ๊ฐ์ ์๊ฐ์ด ์์๋๋ ์ฌ๊ทํจ์์ ๊ฒฐ๊ณผ๊ฐ์ ์ํ๋ก ์ ์ฅํ๋ ๊ฒ์ด ์๋๋ผ, memoize์ํจ ๊ฒฐ๊ณผ๊ฐ์ ์ ์ฅํ๋ค๋ฉด ์ฌ๋ ๋๋ง์ ๋ํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๊ฒ ๋ค๋ ์๊ฐ์ด ๋ค์๋ค.
ํ๊ธฐ ์์ ์ ๊ฐ์ด useMemo hook์ ์ฌ์ฉํด์ ํจ์ ์ฐ์ฐ์ ๊ฒฐ๊ณผ๊ฐ์ memoizedCurrentItem ์ด๋ผ๋ ๋ณ์์ ํ ๋นํ๋ค.
const memoizedCurrentItem = useMemo(
() => findItemByCurrentId(data, currentId),
[currentId]
);
console.log(memoizedCurrentItem, "๋ฉ๋ชจ๊ฐ");
์ด์ id ์ํ๊ฐ์ด ๋ฐ๋๋๋ง๋ค ์ฌ๊ทํจ์ ๊ณ์ฐ ๊ฒฐ๊ณผ๊ฐ์ธ ํด๋น ์์ดํ
๋ฐ์ดํฐ์ ์บ์ฑ๋ ๊ฒฐ๊ณผ๊ฐ์ด ์ ์ฅ๋๋ค.
๋ฐ๋ผ์ id ์ํ๊ฐ์ด ๋ณ๊ฒฝ๋๋ ์๋๊ฐ ๋ ๋น ๋ฅด๊ณ ์ฌ๊ทํจ์์ ์ฐ์ฐ ์๋๊ฐ ๋ ๋๋ฆฐ ๊ฒฝ์ฐ์๋, ์ด๋ฏธ ์ ์ฅ๋์ด์๋ ์ฌ๊ทํจ์์ ๊ฒฐ๊ณผ๊ฐ์ด ๋์ผํ ๊ฒฝ์ฐ์๋ ๋ ๋๋ง์ ํ์ง์๊ณ , ์์ดํ
๋ฐ์ดํฐ์ ๊ฒฐ๊ณผ๊ฐ์ด ์๋ก ๋ฌ๋ผ์ง๋ ๊ฒฝ์ฐ์๋ง ์ฌ ๋ ๋๋ง์ด ๋๋ ๊ฒ์ ํ์ธํ ์ ์์๋ค.