Tree Map Mathod
Tree์ ๋ฉ์๋์ธ map์ ๊ตฌํํ๋๋ฐ ์๊ฐ์ด ์ค๋ ๊ฑธ๋ ธ๋ค..
map ๋ฉ์๋๋ ์๋์ ๊ฐ์ ํน์ฑ์ ๊ฐ์ง๋ค.
1. ๊ธฐ์กด ๊ฐ์ฒด์ ๊ฐ์ ๊ตฌ์กฐ์ด๋ ๊ฐ์ฒด์ ๊ฐ๋ค์ callback ํจ์์ ์์๋๋ก ๋ฃ์ด ์คํ์ํจ ๊ฐ์ด์ด์ผ ํ๋ค.
- ๊ธฐ์กด ๊ฐ์ฒด์ ์ฃผ์๊ฐ์ ์ฐธ์กฐํ๋ฉด ์๋จ => ์์ ๋ณต์ฌ(shallow copy)
- ์๋ก์ด ๊ณต๊ฐ์ ๊ธฐ์กด ๊ฐ์ฒด์ ์ฃผ์๊ฐ๊ณผ ์๊ด์๋ ์๋ก์ด ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด์ผํจ => ๊น์ ๋ณต์ฌ(deep copy)
2. ๊ธฐ์กด ๊ฐ์ฒด๋ ์์ ๋๋ฉด ์๋๋ค.
3. ์๋ก ๋ง๋ค์ด์ง ๊ฐ์ฒด๋ค์ Tree Class์ instance์ฌ์ผ ํ๋ค.
1๋ฒ์ ๊ตฌํํ๊ธฐ ์ํด deep copy๋ฅผ ๊ตฌ๊ธ๋งํ์ฌ ์ฐพ์๋ณด์๋ค.
JSON.stringify๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ฒด๋ฅผ ๋ฌธ์๋ก ๋ฐ๊พธ๊ณ , JSON.parse๋ฅผ ์ด์ฉํ์ฌ ๋ฌธ์๋ฅผ ๊ฐ์ฒด๋ก ๋ค์ ๋ฐ๊ฟ์ฃผ๋ฉด ๋ณต์ฌํ ๊ฐ์ฒด์ ์ฐ๊ฒฐ์ด ๋๊ธด๋ค๊ณ ํ๋ค.
- JSON.parse(JSON.stringify(this))
๋๋์ด ์ด์ ๋ฌธ์ ๋ฅผ ํธ๋๊ฐ์ถ์ด ๊ธฐ์๋ง์์ผ๋ก ์ฝ๋๋ฅผ ์๋์ ๊ฐ์ด ์์ฑํ์๋ค.
let cloneObj = new Tree();
Object.assign(cloneObj, JSON.parse(JSON.stringify(this)));
๊ทธ๋ฐ๋ฐ..๋ฃจํธ ๋
ธ๋์ constructor๋ง Tree๋ก ์ค์ ๋์๊ณ , ์์๋
ธ๋๋ค์ Object๋ก ๋์ด์๋ค..
assign์ ํตํด Tree์ Instance์ JSON.parse(JSON.stringify(this))๋ฅผ ์ฐ๊ฒฐํด์ฃผ๋ฉด Prototype์ด ๋ชจ๋ ๋
ธ๋์ ์์๋๋์ค ์์๋๋ฐ.. ๋ฃจํธ ๋
ธํธ์๋ง ์์๋๋ค..
๋ชจ๋ ๋
ธ๋๋ฅผ ์ํํ๋ฉด์ Tree์ Instance๋ก ๋ฐ๊ฟ์ฃผ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผํ๋์ง..๋๋ฌด์ง ๊ฐ์ด ์์กํ๋ค.
๊ทธ๋์ ๊ฒฐ๊ตญ ๋ช์๊ฐ์ ๊ณ ๋ฏผํ๋ฉฐ ์๋ํด๋ณด๋ค๊ฐ.. ๊ฒฐ๊ตญ ๋ต์ง๋ฅผ ๋ณด์๋ค.. ใ
reference ์ฝ๋ ์ ๋ฌธ์ด๋ค.
var Tree = function(value) {
this.value = value;
this.children = [];
};
Tree.prototype.addChild = function(child) {
if (!child || !(child instanceof Tree)) {
child = new Tree(child);
}
this.children.push(child);
return this;
};
Tree.prototype.map = function(callback) {
return this.children.reduce(function(tree, child) {
return tree.addChild(child.map(callback));
}, new Tree(callback(this.value)));
};
์ ์ด์ ๋ด๊ฐ ๊ณ ๋ฏผํ๊ณ ๊ณ ๋ฏผํ๋ map ๋ฉ์๋๋ฅผ ๋ถ์ํด๋ณด์.
Tree.prototype.map = function(callback) {
return this.children.reduce(function(tree, child) {
return tree.addChild(child.map(callback));
}, new Tree(callback(this.value)));
};
๐ reference ๋ถ์
- ๋ฃจํธ ๋
ธ๋์ ์์๋
ธ๋๊ฐ ๋ด๊ธด ๋ฐฐ์ด์ ๊ฐ ์์๋
ธ๋์ ๋ฆฌ๋์ค๋ฅผ ์คํํ๋ค.
- ์ด๋ ์ด๊ธฐ๊ฐ(initial value) ์ ๋ฃจํธ ๋
ธ๋์ value๋ฅผ ์ธ์๋ก ๋ฐ์ callback ํจ์๋ฅผ ์คํํ ๊ฒฐ๊ณผ๊ฐ์ผ๋ก ๋ง๋ค์ด์ง ์๋ก์ด ํธ๋ฆฌ๋
ธ๋์ด๋ค.
- ๊ฐ๊ฐ์ ์์๋
ธ๋์ ๋ฆฌ๋์ค๋ฅผ ์คํํ๋ฉด
- ์ฒซ๋ฒ์งธ๋ก ํ์ฌ ์์๋
ธ๋์ ์์๋
ธ๋๋ฐฐ์ด์ ๊ฐ ์์ ์์์ ๋ฆฌ๋์ค ๋ฉ์๋๋ฅผ ์คํํ๋ค.
- ์ด๋ ์ด๊ธฐ๊ฐ(initial value)์ ํ์ฌ ์์ ๋
ธ๋์ value๋ฅผ ์ธ์๋ก ๋ฐ์ callback ํจ์๋ฅผ ์คํํ ๊ฒฐ๊ณผ๊ฐ์ผ๋ก ๋ง๋ค์ด์ง ์๋ก์ด ํธ๋ฆฌ๋
ธ๋์ด๋ค.
- ๋ง์ฝ ํ์ฌ ์์๋
ธ๋์ ์์๋
ธ๋๋ฐฐ์ด์ด ๋น๋ฐฐ์ด์ด๋ผ๋ฉด reduce๋ฅผ ์คํํด ์ค ์์๋ค์ด ์๊ธฐ๋๋ฌธ์ ์ด๊ธฐ๊ฐ๋ง ๋ฐํํ์ฌ map ๋ฉ์๋๋ฅผ ์ข
๋ฃํ๊ณ ๋น ์ ธ๋์จ๋ค.
- ํ์ฌ ์ด๊ธฐ๊ฐ(initial value)์ 3๋ฒ์์ ์ป์ ๋ฐํ๊ฐ์ธ ์๋ก์ด ํธ๋ฆฌ๋
ธ๋๋ฅผ ์ธ์๋ก ๋ฃ๊ณ addChild ๋ฉ์๋๋ฅผ ์ ์ฉ์ํจ๋ค.
- addChild ๋ฉ์๋๋ฅผ ์คํํ ํ์ฌ ์ด๊ธฐ๊ฐ(initial value)์ด this๊ฐ ๋๊ณ ์ด this์ children์ 3๋ฒ์์ ์ป์ ๋ฐํ๊ฐ์ธ ์๋ก์ด ํธ๋ฆฌ๋
ธ๋๋ฅผ pushํ๋ค.
- ๊ทธ๋ฆฌ๊ณ this๋ฅผ ๋ฐํ ํ๋ค.
- addChild ๋ฉ์๋ ์คํ์ด ๋๋๊ณ reduce๋ก ๋์์ค๋ฉด ๋ฐํ๋ this๊ฐ ๋ค์ ์์ ์์์ reduce๋ฅผ ์คํํ ๋ ๋์ ๊ฐ(accumulate)์ด ๋๋ค.
var identity = function(value) {
return value;
};
var input = new Tree(1);
input.addChild(2);
input.addChild(3);
var result = input.map(identity);
map method ์คํ์์
- ํ์ฌ input = {value : 1, children : [{value : 2, children : []}, {value : 3, children : []}]}
- map ๋ฉ์๋ ์คํ
- ์ฒซ๋ฒ์งธ ๋์ ๊ฐ = Tree {value : 1, children : []}
- ๋๋ฒ์งธ ๋์ ๊ฐ = Tree {value : 1, children : [{value : 2, children : []}]}
- ์ธ๋ฒ์งธ ๋์ ๊ฐ = Tree {value : 1, children : [{value : 2, children : []}, {value : 3, children : []}]}
๐ ๋์ ๋ฌธ์ ์
- ๋๋ ๊ณ์ ์ด๋ฏธ ๋ง๋ค์ด์ ธ ์๋ ๊ฐ์ฒด์์ฒด๋ฅผ ์ ๋ถ ๋ณต์ฌํด์ ๊ทธ ์ํ์์ ํ๋กํ ํ์
์ Tree๋ก ๋ฐ๊ฟ์ค ์๊ฐ๋ง ๊ณ์ ํ๋ค..
- ํ๊ฐ์ง ๋ฐฉ๋ฒ๋ง ์๊ฐํ๋ค
- callback ํจ์๋ฅผ ์ฌ๊ทํจ์ ์์์ ์คํ์์ผ return ํด์ฃผ๋ ค๊ณ ํ๋ ๊ณ์ for๋ฌธ์ด loop๋ฅผ ๋์ง์๊ณ callbackํจ์๋ฅผ ํ๋ฒ ๋๊ณ return์ผ๋ก ๋๊ฒจ ๋ฒ๋ฆฌ๋ ๋์ฒด ์ด๋ป๊ฒํ๋ฉด ์ฌ๊ทํจ์์ฒ๋ผ loop๋ฅผ ๋๋ ์ฝ๋ ์์์ callback์ returnํ ๊น.. ์ด ์๊ฐ๋ง ๊ณ์ํ๋ค. callback ํจ์๋ฅผ ์คํ์์ผ ๋ฐํ๋ ๊ฐ์ ์ด์ฉํด ์๋ก์ด ์ธ์คํด์ค ๊ฐ์ฒด๋ฅผ ๋ง๋ค๋ฉด ๋๋ ๊ฒ์..! callback ํจ์๊ฐ ํด๋น ์ฝ๋์์ ์ด๋ ํ ์ญํ ์ ํ๋์ง ์ ๋๋ก ํ์
์ ๋ชปํ๊ณ ์ฝ๋๋ฅผ ์์ฑํ์ฌ ์๋ชป๋ ๋ฐฉํฅ์ผ๋ก ์ ๊ทผํ ๊ฒ ๊ฐ๋ค. ๋ค์๋ถํฐ๋ ํ
์คํธ์ฝ๋๋ฅผ ํตํด ๋ฉ์๋๋ callback ํจ์์ ์ฌ์ฉ ์๋๋ฅผ ํ์คํ๊ฒ ํ์
ํ ํ ์ฝ๋์์ฑ์ ๋ค์ด๊ฐ์ผ๊ฒ ๋ค.