-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path5. 실전코드조각1.html
225 lines (212 loc) · 6.96 KB
/
5. 실전코드조각1.html
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>5. 실전코드조각-1</title>
<script src="js/partial.js"></script>
<script src="js/_.js"></script>
</head>
<body>
<script>
var users = [
{ id: 101, name: 'ID' },
{ id: 102, name: 'BJ' },
{ id: 103, name: 'PJ' },
{ id: 104, name: 'HA' },
{ id: 105, name: 'JE' },
{ id: 106, name: 'JI' }
];
var posts = [
{ id: 201, body: '내용1', user_id: 101 },
{ id: 202, body: '내용2', user_id: 102 },
{ id: 203, body: '내용3', user_id: 103 },
{ id: 204, body: '내용4', user_id: 102 },
{ id: 205, body: '내용5', user_id: 101 },
];
var comments = [
{ id: 301, body: '댓글1', user_id: 105, post_id: 201 },
{ id: 302, body: '댓글2', user_id: 104, post_id: 201 },
{ id: 303, body: '댓글3', user_id: 104, post_id: 202 },
{ id: 304, body: '댓글4', user_id: 105, post_id: 203 },
{ id: 305, body: '댓글5', user_id: 106, post_id: 203 },
{ id: 306, body: '댓글6', user_id: 106, post_id: 204 },
{ id: 307, body: '댓글7', user_id: 102, post_id: 205 },
{ id: 308, body: '댓글8', user_id: 103, post_id: 204 },
{ id: 309, body: '댓글9', user_id: 103, post_id: 202 },
{ id: 310, body: '댓글10', user_id: 105, post_id: 201 }
];
console.log(
comments.filter((result)=>{
return result.id > 300;
}))
//1. 특정인이 작성한 글의 comments를 찾는다. 기본 로직
console.log(_filter(posts, function (post) {
return post.user_id == 101
}));
//1-1. 가장 접근이 쉬운 방법으로 우선 구현
_go(
_filter(posts, function (post) {
return post.user_id == 101
}),
function (posts) {
return _filter(comments, function (comment) {
return _find(posts, function (post) {
return post.id == comment.post_id
})
})
},
console.log
);
//1-2. post_id 만 필요하므로 find 를 map 으로 대채
_go(
_.filter(posts, function (post) {
return post.user_id == 101
}),
_.map(function(post) {
return post.id
}),
function (post_ids) {
return _filter(comments, function (comment) {
return _.contains(post_ids, comment.post_id)
})
},
console.log
);
//1-3 map을 pluck로 대체
_go(
_.filter(posts, function (post) {
return post.user_id == 101
}),
_.pluck('id'),
function (post_ids) {
return _filter(comments, function (comment) {
return _.contains(post_ids, comment.post_id)
})
},
console.log
);
//1-4 filter를 where로 대체 where은 filter 로 만들어져 있다.
_go(
_.where(posts, {user_id:101}),
_.pluck('id'),
function (post_ids) {
return _filter(comments, function (comment) {
return _.contains(post_ids, comment.post_id)
})
},
console.log
);
//2. 특정인에 post에 달려있는 모든 코멘트의 작성자 명칭을 뽑기
_go(
_.where(posts, {user_id:101}),
_.pluck('id'),
function (post_ids) {
return _filter(comments, function (comment) {
return _.contains(post_ids, comment.post_id)
})
},
_.map(function (comment) {
return _find(users, function (user) {
return user.id == comment.user_id
}).name
}),
_.uniq,
console.log
);
//최적화 하여 사용
// 1. 특정인의 posts의 모든 comments 거르기
function posts_by(attr) {
return _.where(posts, attr);
}
var comments_by_posts = _.pipe(
_.pluck('id'),
function(post_ids) {
return _.filter(comments, function(comment) {
return _.contains(post_ids, comment.post_id);
});
});
var f1 = _.pipe(posts_by, comments_by_posts);
console.log(f1({ user_id: 101 }));
// 2. 특정인의 posts에 comments를 단 친구의 이름들 뽑기
var comments_to_user_names = _.map(function(comment) {
return _.find(users, function(user) {
return user.id == comment.user_id;
}).name;
});
var f2 = _.pipe(f1, comments_to_user_names, _.uniq);
console.log(f2({ user_id: 101 }));
// 3. 특정인의 posts에 comments를 단 친구들 카운트 정보
var f3 = _.pipe(f1, comments_to_user_names, _.count_by);
console.log(f3({ user_id: 101 }));
// 4. 특정인이 comment를 단 posts 거르기
_.go(
_.where(comments, { user_id: 105 }),
_.pluck('post_id'),
_.uniq,
function(post_ids) {
return _.filter(posts, function(post) {
return _.contains(post_ids, post.id);
});
},
console.log);
// 5. users + posts + comments (index_by와 group_by로 효율 높이기)
var users2 = _.index_by(users, 'id');
var comments2 = _.go(
comments,
_.map(function(comment) {
return _.extend({
user: users2[comment.user_id]
}, comment);
}),
_.group_by('post_id'));
console.log(comments2);
var posts2 = _.go(
posts,
_.map(function(post) {
return _.extend({
comments: comments2[post.id] || [],
user: users2[post.user_id]
}, post);
}));
var posts3 = _.group_by(posts2, 'user_id');
console.log(posts3);
var users3 = _.map(users2, function(user) {
return _.extend({
posts: posts3[user.id] || []
}, user);
});
console.log(users3);
// 5.1. 특정인의 posts의 모든 comments 거르기
var user = users3[0];
_.go(user.posts,
_.pluck('comments'),
_.flatten,
console.log);
console.log(_.deep_pluck(user, 'posts.comments'));
// 5.2. 특정인의 posts에 comments를 단 친구의 이름들 뽑기
_.go(user.posts,
_.pluck('comments'),
_.flatten,
_.pluck('user'),
_.pluck('name'),
_.uniq,
console.log);
_.go(user, _.deep_pluck('posts.comments.user.name'), _.uniq, console.log);
// 5.3. 특정인의 posts에 comments를 단 친구들 카운트 정보
_.go(user.posts,
_.pluck('comments'),
_.flatten,
_.pluck('user'),
_.pluck('name'),
_.count_by,
console.log);
_.go(user, _.deep_pluck('posts.comments.user.name'), _.count_by, console.log);
// 5.4. 특정인이 comment를 단 posts 거르기
console.log(
_.filter(posts2, function(post) {
return _.find(post.comments, function(comment) {
return comment.user_id == 105;
})
})
);
</script>