데이터 필터링

✒️ 2025-05-28 10:01 내용 수정



Array 객체의 filter() 메소드 사용

/* eslint-disable */
import 'bootstrap/dist/css/bootstrap.min.css';
import '../Food.css';
import {useState} from 'react';
import FoodBox from './FoodBox.js'
import item from '../data/sample.json';

function Food() {
  
  let [food, setFood] = useState(item);
  let [flag, setFlag] = useState([true, true, true, true]);

  let order = ['id', 'title', 'calorie', 'createdAt'];
  let orderName = ['아이디', '이름', '칼로리', '생성날짜'];

  // 필터링을 위한 함수
  const calorieDown = (n) => {
    let result = [...food].filter((v)=>{return (v.calorie <= n)});
    setFood(result);
  }

  const calorieUp = (n) => {
    let result = [...food].filter((v)=>{return (v.calorie >= n)});
    setFood(result);
  }

  const dateUp = (n) => { // 날짜는 Date() 객체를 사용하여 비교했다
    let dateCut = new Date(2021, n-1, 2).toISOString().substring(0, 10);
    let result = [...food].filter((v)=>{
      let date = new Date(v.createdAt).toISOString().substring(0, 10);
      return date >= dateCut;
    });
    setFood(result);
  }

  const dateDown = (n) => {
    let dateCut = new Date(2021, n-1, 2).toISOString().substring(0, 10);
    let result = [...food].filter((v)=>{
      let date = new Date(v.createdAt).toISOString().substring(0, 10);
      return date < dateCut;
    });
    setFood(result);
  }
  
  const deleteItem = (id) => {
    let result = [...food].filter((v)=>{return (v.id != id)});
    setFood(result);
  }

  // 정렬을 위한 함수
  let orderList = (f, i) => {
    let copy = [...flag];
    if (i == 1) {
      if (f) {
        setFood([...food].sort((a, b) => {return a[order[i]].localeCompare(b[order[i]])}));
      } else {
        setFood([...food].sort((a, b) => {return b[order[i]].localeCompare(a[order[i]])}));
      }
    } else {
      if (f) {
        setFood([...food].sort((a, b) => (a[order[i]] - b[order[i]])));
      } else {
        setFood([...food].sort((a, b) => (b[order[i]] - a[order[i]])));
      }
    }

    copy[i] = !copy[i];
    setFlag(copy);
  };

  return (
    <>
      <section className='section sec'>
        <div className='container-lg'>
          <h2 className='title'>Food List</h2>
          <!-- 정렬 버튼들 -->
          <div className='btn-wrap'>
            {
              order.map((el, i)=>{
                return(
                  <button key={i} className='btn btn-primary' onClick={()=>{orderList(flag[i], i)}} >{
                    (flag[i]) ? orderName[i] + ' 오름차순' : orderName[i] + ' 내림차순'
                  } 정렬</button>
                )
              })
            }
          </div>
          <!-- 필터링에 필요한 버튼들 -->
          <div className='btn-wrap filter'>
	        <!-- 초기 배열을 다시 출력할 수 있는 버튼도 추가했다 -->
            <button className='btn btn-success' onClick={()=>{setFood(item)}}>전체</button>
            <!-- 필터링 버튼 -->
            <button className='btn btn-success' onClick={()=>{calorieDown(200)}}>칼로리 200 이하만 보기</button>
            <button className='btn btn-success' onClick={()=>{calorieUp(200)}}>칼로리 200 이상만 보기</button>
            <button className='btn btn-success' onClick={()=>{dateDown(7)}}>7월 이전만 보기</button>
            <button className='btn btn-success' onClick={()=>{dateUp(7)}}>7월 이후만 보기</button>
          </div>
          <ul className='row row-cols-1'>
            {
              food.map((el, i) => {
                return( // 각 항목별 삭제한 배열을 반환하기 위해 항목 제거 함수를 넘겨준다
                  <FoodBox key={el.id} food={el} deleteItem={deleteItem}></FoodBox>
                );
              })
            }
          </ul>
        </div>
      </section>
    </>
  );
}

export default Food;
function FoodBox(props) {
    let {food, deleteItem} = props;
    let {id, imgUrl, title, content, calorie, createdAt} = food;
    let date = new Date(createdAt).toISOString().substring(0, 10);

    return(
      <li className='col box'>
        <div className='gt'>
          <img src={imgUrl} alt={title}></img>
          <div className="text-box">
            <ul className="info">
              <li><h3>{title}</h3></li>
              <li>id : {id}</li>
              <li>용량 : {content}</li>
              <li>칼로리 : {calorie}</li>
              <li>생성 날짜 : {date}</li>
              <!-- 특정 항목 제거 버튼 -->
              <button className='btn btn-dark' onClick={()=>{deleteItem(id)}}>제거</button>
            </ul>
          </div>
        </div>
      </li>
    )
  }

export default FoodBox;

react filter 1.png

react filter 2.png

react filter 3.png
react filter 4.png

react filter 5.png
react filter 6.png