여러 조건을 만족하는 데이터 구하기
✨여러 조건을 만족하는 데이터 구하기
프로젝트를 진행하다보면 여러 조건을 만족하는 데이터를 구해야하는 경우들이 있다. 이를 연습해보기 위해 다음과 같은 조건을 가진 필터링 기능을 만들어 보았다.
💡필터링 조건
1. 사용자가 입력한 도서관 이름 필터링
- 사용자가 전체 도서관이 아니라
특정 도서관
을 선택했을 때 해당 도서관에 있는 도서들만 검색하기
2. 사용자가 입력한 검색어를 바탕으로 필터링
- 사용자가
책 제목
을 선택하고 검색어를 입력했을 경우, 책 제목이 일치하는 도서 검색 - 사용자가
작가
를 선택하고 검색어를 입력했을 경우, 작가가 일치하는 도서 검색 - 사용자가
출판사
를 선택하고 검색어를 입력했을 경우, 출판사가 일치하는 도서 검색 - 사용자가
전체
를 선택하고 검색어를 입력했을 경우, 책 제목 또는 작가 또는 출판사가 일치하는 도서 검색
3. 사용자가 입력한 기간을 바탕으로 필터링
- 사용자가 startDate를 선택한다면, 해당 날짜 이후에 출시된 도서 검색
- 사용자가 endDate를 선택한다면, 해당 날짜 이후에 출시된 도서 검색
- 사용자가 startDate와 endDate를 선택한다면, startDate보다 이후에 출시된 도서와, endDate 이전에 출시된 도서 검색
💡코드 작성
전체 도서(원본 데이터)를 filter 하도록 설정하는데, 조건을 만족하는 데이터만 반환하도록 설정,
만약 해당 조건을 만족시키지 않다면, early return 하도록 설정하여 제거
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
226
227
228
229
import React, { useState } from "react";
// 가상의 도서 데이터
const initialData = [
{
id: 1,
title: "To Kill a Mockingbird",
publisherId: 101,
publisher: "HarperCollins",
libraryName: "Central Library",
author: "Harper Lee",
publicationDate: "1960-07-11",
status: "Available"
},
{
id: 2,
title: "1984",
publisherId: 102,
publisher: "Secker & Warburg",
libraryName: "City Branch",
author: "George Orwell",
publicationDate: "1949-06-08",
status: "Checked Out"
},
{
id: 3,
title: "The Great Gatsby",
publisherId: 103,
publisher: "Charles Scribner's Sons",
libraryName: "Main Library",
author: "F. Scott Fitzgerald",
publicationDate: "1925-04-10",
status: "Available"
},
{
id: 4,
title: "To Kill a Mockingbird",
publisherId: 101,
publisher: "HarperCollins",
libraryName: "West Branch",
author: "Harper Lee",
publicationDate: "1960-07-11",
status: "Available"
},
{
id: 5,
title: "Moby-Dick",
publisherId: 104,
publisher: "Richard Bentley",
libraryName: "Downtown Branch",
author: "Herman Melville",
publicationDate: "1851-10-18",
status: "Available"
},
{
id: 6,
title: "The Catcher in the Rye",
publisherId: 105,
publisher: "Little, Brown and Company",
libraryName: "East Branch",
author: "J.D. Salinger",
publicationDate: "1951-07-16",
status: "Checked Out"
}
];
function App() {
const books = initialData;
const libraries = Array.from(
new Set(initialData.map((item) => item.libraryName))
);
const [filteredBooks, setFilteredBooks] = useState(initialData);
const [searchKeyword, setSearchKeyword] = useState("");
const [libraryName, setLibraryName] = useState("전체");
const [bookContent, setBookContent] = useState("ALL");
const [startDate, setStartDate] = useState("");
const [endDate, setEndDate] = useState("");
const handleFilter = (event) => {
event.preventDefault();
const filtered = books.filter((book) => {
// 소장하고 있는 도서관 필터링
if (libraryName !== "전체" && book.libraryName !== libraryName)
return false;
// 도서관련 내용 필터링 (제목, 출판사, 작가)
switch (bookContent) {
case "Title":
if (!book.title.toLowerCase().includes(searchKeyword.toLowerCase()))
return false;
break;
case "Author":
if (!book.author.toLowerCase().includes(searchKeyword.toLowerCase()))
return false;
break;
case "Publisher":
if (
!book.publisher.toLowerCase().includes(searchKeyword.toLowerCase())
)
return false;
break;
case "ALL":
if (
!book.title.toLowerCase().includes(searchKeyword.toLowerCase()) &&
!book.author.toLowerCase().includes(searchKeyword.toLowerCase()) &&
!book.publisher.toLowerCase().includes(searchKeyword.toLowerCase())
) {
return false;
}
break;
}
// 사용자가 지정한 기간을 바탕으로 책 출판일 필터링
if (startDate && new Date(book.publicationDate) < new Date(startDate))
return false;
if (endDate && new Date(book.publicationDate) > new Date(endDate))
return false;
// 모든 조건 성립 시 true 반환
return true;
});
if (filtered.length > 0) {
setFilteredBooks(filtered);
} else {
setFilteredBooks([]);
}
};
const handleReset = () => {
setFilteredBooks(initialData);
setSearchKeyword("");
setLibraryName("전체");
setBookContent("ALL");
setStartDate("");
setEndDate("");
};
return (
<div>
<h1>도서 목록</h1>
<div style=>
<table>
<thead>
<tr>
<td>도서 제목</td>
<td>작가</td>
<td>출판사</td>
<td>출판일</td>
<td>소장 도서관</td>
<td>도서 상태</td>
</tr>
</thead>
<tbody>
{filteredBooks.length === 0 && (
<tr>
<td colSpan="6">일치하는 검색결과가 없습니다.</td>
</tr>
)}
{filteredBooks.length !== 0 &&
filteredBooks.map((book) => (
<tr key={book.id}>
<td>{book.title}</td>
<td>{book.author}</td>
<td>{book.publisher}</td>
<td>{book.publicationDate}</td>
<td>{book.libraryName}</td>
<td>{book.status}</td>
</tr>
))}
</tbody>
</table>
<div>
<form onSubmit={handleFilter}>
<fieldset>
<label>도서관</label>
<select onChange={(e) => setLibraryName(e.target.value)}>
<option defaultValue="All">전체 도서관</option>
{libraries.map((library) => (
<option value={library}>{library}</option>
))}
</select>
</fieldset>
<fieldset>
<label>검색</label>
<select onChange={(e) => setBookContent(e.target.value)}>
<option defaultValue="All">전체</option>
<option value="Title">책 제목</option>
<option value="Author">작가</option>
<option value="Publisher">출판사</option>
</select>
<input
type="text"
placeholder="검색어를 입력하세요"
onChange={(e) => setSearchKeyword(e.target.value)}
/>
</fieldset>
<fieldset>
<label>출판일</label>
<div style=>
<p>시작일</p>
<input
type="date"
value={startDate}
onChange={(e) => setStartDate(e.target.value)}
/>
</div>
<div style=>
<p>시작일</p>
<input
type="date"
value={endDate}
onChange={(e) => setEndDate(e.target.value)}
/>
</div>
</fieldset>
<button type="submit">검색하기</button>
<button type="button" onClick={handleReset}>
초기화
</button>
</form>
</div>
</div>
</div>
);
}
export default App;
하단의 Codepen에서 필터링 기능을 사용해보세요.
See the Pen 조건 여러개 데이터 필터링하기 by 혬 (@jexbagvl-the-reactor) on CodePen.
This post is licensed under CC BY 4.0 by the author.