์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- slice/splice/split
- @redux-toolkit
- ์๋ฐ์คํฌ๋ฆฝํธ
- ํท๊ฐ๋ฆฐ๋ค~
- https://dasima.xyz/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EC%A0%9C%EA%B3%B1-math-pow-%EA%B3%84%EC%82%B0/
- react
- ใทใ
- variable#function
- CSS
- ์๋ฐ์คํฌ๋ฆฝํธ#JS#var#let#const#undefined#null
- UI
- https://lo-victoria.com/introduction-to-redux-toolkit-for-beginners
- ์๋ฐ์คํฌ๋ฆฝํธ#์กฐ๊ฑด๋ฌธ#๋ฌธ์์ด
- redux์ํ์ ์ง
- User Flow
- ์๋ฐ์คํฌ๋ฆฝํธ#JS#slice#splice
- JS#3์ผ์ฐจ๋ฌ๋ฆฌ์#์ด๋ฐ์ธ๋ฐ#์๊ฐ๊ธ๋ฐฉ~
- cmarket
- Beesbeesbees
- children vs childrenNodes
- dom
- https://www.daleseo.com/js-array-slice-splice/
- toString#String
- https://developer-talk.tistory.com/299
- removeCookie
- ๋ ธ๋๊ต๊ณผ์
- ๋ด์ฅ๊ณ ์ฐจํจ์
- for~in/for~of
- js
- UX
- Today
- Total
Daily Front_Minhhk
JSON.stringify() // JSON.parse() // Tree UI ๋ณธ๋ฌธ
๐ก JSON์ JavaScript Object Notation์ ์ค์๋ง๋ก, ๋ฐ์ดํฐ ๊ตํ์ ์ํด ๋ง๋ค์ด์ง ๊ฐ์ฒด ํํ์ ํฌ๋งท
JSON.stringify
JSON.stringify : ๊ฐ์ฒด๋ฅผ JSON์ผ๋ก ๋ณํํ๋ค.
JSON์ผ๋ก ๋ณํ๋ ๊ฐ์ฒด์ ํ์ ์ ๋ฌธ์์ด์ด๋ค.
→
JSON.stringifyํ๋ ์ด ๊ณผ์ ์ **์ง๋ ฌํ(serialize)**ํ๋ค๊ณ ํฉ๋๋ค.
JSON.parse
JSON.parse : JSON์ ๊ฐ์ฒด๋ก ๋ณํํ๋ค.
→
JSON.parse๋ฅผ ์ ์ฉํ๋ ์ด ๊ณผ์ ์ **์ญ์ง๋ ฌํ(deserialize)**ํ๋ค๊ณ ํฉ๋๋ค.
JSON์ ๊ธฐ๋ณธ ๊ท์น
JSON์ ์ผํ ๋ณด๊ธฐ์ ์๋ฐ์คํฌ๋ฆฝํธ์ ๊ฐ์ฒด์ ๋ณ๋ฐ ๋ค๋ฅผ ๋ฐ๊ฐ ์์ด ๋ณด์ด์ง๋ง, ์๋ฐ์คํฌ๋ฆฝํธ์ ๊ฐ์ฒด์๋ ๋ฏธ๋ฌํ๊ฒ ๋ค๋ฅธ ๊ท์น์ด ์์ต๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ์ฒด JSON
ํค | ํค๋ ๋ฐ์ดํ ์์ด ์ธ ์ ์์{ key : "property" } | ๋ฐ๋์ ์๋ฐ์ดํ๋ฅผ ๋ถ์ฌ์ผ ํจ'{"key":"property"}' |
๋ฌธ์์ด ๊ฐ | ์์๋ฐ์ดํ๋ ์ฌ์ฉ ๊ฐ๋ฅ{ "key" : 'property' } | ๋ฐ๋์ ํฐ๋ฐ์ดํ๋ก ๊ฐ์ธ์ผ ํจ'{"key":"property"}' |
ํค์ ๊ฐ ์ฌ์ด ๊ณต๋ฐฑ | ์ฌ์ฉ ๊ฐ๋ฅ{"key" : 'property'} | ์ฌ์ฉ ๋ถ๊ฐ๋ฅ'{"key":"property"}' |
ํค-๊ฐ ์ ์ฌ์ด ๊ณต๋ฐฑ | ์ฌ์ฉ ๊ฐ๋ฅ{ "key":'property', num:1 } | ์ฌ์ฉ ๋ถ๊ฐ๋ฅ'{"key":"property","num":1}' |
๊ณผ์ 1 - JSON.stringify
ํ ์คํธ ์ผ์ด์ค๋ฅผ 3๊ฐ์ง๋ก ๋๋ ๋ณผ ์ ์๋ค
- ๊ฐ์ฒด๋ ๋ฐฐ์ด์ด ์๋ ๊ฒฝ์ฐ1) number, null, boolean ๋ฌธ์์ด๋ก ๋ฆฌํด, string ์ผ๋๋ ์๋ค๋ก "" ์ถ๊ฐ๋ก ๋ฃ์ด์ค์ผ ํ๋ค
- ๋ฐฐ์ด์ธ ๊ฒฝ์ฐArray.isArray๋ก ๋ฐฐ์ด์ธ์ง ํ์ธํ ๋ค stringifyJSON(์ฌ๊ทํจ์)์ ์ฌ์ฉํด์ ์ ๋ฐฐ์ด์ ๋ฃ์ด์ค ๋ค ๋ฆฌํด
- ๊ฐ์ฒด์ธ ๊ฒฝ์ฐ ๊ฐ์ฒด์ key๊ฐ undefined || value ์ function, undefined ๊ฐ ๋ค์ด์์ ๊ฒฝ์ฐ {}๋ฆฌํด,,
- ๋๋จธ์ง ๊ฒฝ์ฐ์ ์์ฑ : ๊ฐ ํํ์ ๋ฌธ์์ด๋ก ์ ์ฅํ ๋ค ๋ฆฌํด
/**
* 1. Browser์ ์กด์ฌํ๋ JSON.stringfy ํจ์๋ฅผ ์ง์ ๊ตฌํํด ๋ด
๋๋ค.
* JSON.stringfy ํจ์๋ input ๊ฐ์ JSON ํ์์ผ๋ก ๋ณํํฉ๋๋ค.
* ๋จ, undefined์ function์ JSON์ผ๋ก ์๋ต๋๊ฑฐ๋ null๋ก ๋ณํ๋ฉ๋๋ค.
*
* 2. stringfyJSON์ ์๋์ ๊ฐ์ด ์๋ํฉ๋๋ค.
* - Boolean์ด input์ผ๋ก ์ฃผ์ด์ก์ ๊ฒฝ์ฐ
* stringifyJSON(true); // 'true'
* - String์ด input์ผ๋ก ์ฃผ์ด์ก์ ๊ฒฝ์ฐ
* stringifyJSON('foo'); // '"foo"'
* - Array๊ฐ input์ผ๋ก ์ฃผ์ด์ก์ ๊ฒฝ์ฐ
* stringifyJSON([1, 'false', false]); // '[1,"false",false]'
* - Object๊ฐ input์ผ๋ก ์ฃผ์ด์ก์ ๊ฒฝ์ฐ
* stringifyJSON({ x: 5 }); // '{"x":5}'
* - undefined, function์ด ์ฃผ์ด์ก์ ๊ฒฝ์ฐ
* stringifyJSON(undefined) // undefined
* stringifyJSON(function(){}) // undefined
* stringifyJSON({ x: undefined, y: function(){} }) // '{}'
*
* 3. spec/stringifyJSONSpec.js์ stringifiableObjects ๋ฐฐ์ด์ ์ฐธ๊ณ ํด์ ํ
์คํธ์์ ์ด๋ค input ๊ฐ๋ค์ด
* ์ฃผ์ด์ง๊ณ , ์ด๋ป๊ฒ stringifyํด ์ฃผ์ด์ผ ํ ์ง ์๊ฐํด ๋ณด์ธ์.
*
* 4. ๊ทธ๋ฅ ํ
์คํธ ํต๊ณผ๋ฅผ ํ๊ณ ์ถ์ผ์๋ค๋ฉด, ๋ค์๊ณผ ๊ฐ์ด ๊ตฌํํ๋ฉด ๋ ๊ฑฐ์์.
* const stringifyJSON = JSON.stringify;
*
* ํ์ง๋ง ์ด ๊ณผ์ ์ ๋ชฉ์ ์ ์ฌ๊ท๋ฅผ ๊ณต๋ถํ๋ ๊ฒ์ด๋, ์ฒ์๋ถํฐ ๊ตฌํํด๋ด์ผ๊ฒ ์ง์?:
*/
์ฃผ์๊ณผ ํ ์คํธ ์ผ์ด์ค๋ฅผ ์ฐธ๊ณ ํ์ฌ ์์ฑ!!
function stringifyJSON(obj) {
// boolean, number, null ์ผ๋
if (typeof obj === "boolean" || typeof obj === "number" || obj === null) {
return String(obj);
}
// string ์ผ ๋
if (typeof obj === "string") {
return `"${obj}"`;
}
//ํจ์์ undefined๋ stringify๋์ง ์์ต๋๋ค.
if (typeof obj === "undefined" || typeof obj === "function") {
return "undefined";
}
// ๋ฐฐ์ด
if(Array.isArray(obj)) {
let result = []
for(let item of obj) {
result.push(stringifyJSON(item))
}
return `[${result}]`
}
// ๊ฐ์ฒด
if(typeof obj === 'object' && obj !== null){
let str = ''
for (let i in obj) {
if(typeof obj[i] === 'function' || obj[i] === undefined) {
return "{}"
}
let newkey = stringifyJSON(i)
let newValue = stringifyJSON(obj[i])
str = str + newkey + ":" + newValue + ','
}
str = str.slice(0,-1)
return `{${str}}`
}
}
๊ณผ์ 2 - Tree UI
์์ ๋ ธ๋๊ฐ ์๋ ๊ฒฝ์ฐ, ์ฌ๊ทํจ์๋ก ๋ฐ๋ณต๋๋ <ul> ํธ์ถํด์ผํ๋ค. ๋ง์ฝ ์์ ๋ ธ๋๊ฐ ์๋ ๊ฒฝ์ฐ <li>์ ์ด๋ฆ์ ๋ฃ์ผ๋ฉด ๋๋ค.
result.html
์์์ธ tree ui ์ด๋ค,,
์ฃผ์ด์ง menu ๋ฐฐ์ด์ ํ์ฉํ์ฌ ๋ฐ๋ณต๋ฌธ๊ณผ ์ฌ๊ท๋ฅผ ํ์ฉํ์ฌ ์์ฑ!!!
fix_me.js
menu์ type์ด "group" ์ด๋ฉด, children์ด ์์ผ๋ฉฐ, children์ type์ด "item"์ด๋ฉด ๋๋๋ค.
์ด๊ฒ์ผ๋ก menu ๋ฐฐ์ด์ ๋ฐ๋ณต๋๋ฉฐ,
์กฐ๊ฑด์ type === "group" ์ผ ๋์ ์๋ ๋ ๋ก ๋๋ ์
ํ์ํ element๋ฅผ ์์ฑํ์ฌ append ํ๋ค.
๊ทธ๋ฆฌ๊ณ children ์ children์ ๋๊ฐ์ด ๋๋๋ง์ ์ํด
์ฌ๊ท ์ฌ์ฉ! ํ์ฌ ์ฝ๋๋ฅผ ์ง ๋ค๐๐ป
const menu = [
{
type: "group",
name: "์๋ฃ",
children: [
{
type: "group",
name: "์ฝ๋ ๋ธ๋ฃจ",
children: [
{ type: "item", name: "๋์ดํธ๋ก ์ฝ๋ ๋ธ๋ฃจ" },
{ type: "item", name: "๋์ฒด ์ฝ๋ ๋ธ๋ฃจ" },
{ type: "item", name: "์ ์ฃผ ๋น์๋ฆผ ์ฝ๋ ๋ธ๋ฃจ" },
{ type: "item", name: "์ฝ๋ ๋ธ๋ฃจ" },
],
},
{
type: "group",
name: "ํ๋ผํธ์น๋
ธ",
children: [
{ type: "item", name: "์ ํ ์ฟ ํค ํฌ๋ฆผ ํ๋ผํธ์น๋
ธ" },
{ type: "item", name: "๋๋ธ ์์คํ๋ ์ ์นฉ ํ๋ผํธ์น๋
ธ" },
{ type: "item", name: "๋ชจ์นด ํ๋ผํธ์น๋
ธ" },
{ type: "item", name: "ํผ์คํ์น์ค ํฌ๋ฆผ ํ๋ผํธ์น๋
ธ" },
],
},
...๋๋จธ์ง ์๋ต
]
const root = document.getElementById("root");
function createTreeView(menu, currentNode) {
// TODO: createTreeView ํจ์๋ฅผ ์์ฑํ์ธ์.
for (let i of menu) {
if (i.type === 'group') {
// li
let li = document.createElement("li");
currentNode.append(li);
// ์ข
๋ฅ ์ด๋ฆ์ span
let span = document.createElement("span");
span.textContent = i.name;
// checkbox ์ค์
let input = document.createElement("input");
// input.type = "checkbox";
input.setAttribute("type","checkbox")
// ul
let ul = document.createElement("ul");
// li ์์ input, span, ul ์ ๋ด์์ ํ์ฌ ๋
ธ๋์๋ค๊ฐ ๋ถ์
li.append(input, span, ul);
//? ์ฌ๊ท๋ฅผ ๋๋ฆฐ๋ค
createTreeView(i.children, ul);
} else {
//! children ์์ ๋
let li = document.createElement('li')
li.textContent = i.name;
currentNode.append(li);
}
}
}
createTreeView(menu, root);
'Code๊ฐ๋ฐ์ผ์ง' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Figma] ๋จ์ถํค,, ๋น๊ทผ๋ง์ผ ์ฑ lo-fi clone (0) | 2022.12.21 |
---|---|
UI UX (0) | 2022.12.19 |
[์๋ฃ๊ตฌ์กฐ/์๊ณ ๋ฆฌ์ฆ] ์ฌ๊ท + ์ฐ์ต๋ฌธ์ ,, (0) | 2022.12.15 |
my-agora-states Server (1) | 2022.12.14 |
express refactoring MiniServer (0) | 2022.12.14 |