December 16, 2019
Tree의 메소드인 map을 구현하는데 시간이 오래 걸렸다..
map 메소드는 아래와 같은 특성을 가진다.
기존 객체와 같은 구조이되 객체의 값들은 callback 함수에 순서대로 넣어 실행시킨 값이어야 한다.
1번을 구현하기 위해 deep copy를 구글링하여 찾아보았다.
JSON.stringify를 사용하여 객체를 문자로 바꾸고, JSON.parse를 이용하여 문자를 객체로 다시 바꿔주면 복사한 객체와 연결이 끊긴다고한다.
드디어 이제 문제를 푸는가싶어 기쁜마음으로 코드를 아래와 같이 작성하였다.
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 the tree for convenience
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)));
};
각각의 자식노드에 리듀스를 실행하면
var identity = function(value) {
return value;
};
var input = new Tree(1);
input.addChild(2);
input.addChild(3);
var result = input.map(identity);