study/JavaScript

sort, filter, map

IT공부 2024. 9. 6. 19:32
반응형
  • html
  <div class="container">
    <div class="row">

    </div>
  </div>
  • 테스트 예제
var products = [{
        id: 0,
        price: 70000,
        title: 'Blossom Dress'
      },
      {
        id: 1,
        price: 50000,
        title: 'Springfield Shirt'
      },
      {
        id: 2,
        price: 60000,
        title: 'Black Monastery'
      }
    ];
  • 동적으로 html 만들기 위한 템플릿 함수
function 템플릿(data) {
      data.forEach((a, i) => {
        var 템플릿 =
          `
      <div class="col-sm-4">
        <img src="https://via.placeholder.com/600" class="w-100">
        <h5>${a.title}</h5>
        <p>${a.price.toLocaleString('ko-Kr')}원</p>
      </div>
    `
        row.append(템플릿);
      })
    }

 

 

Map

  •  map()
    • 새로운 배열을 반환
    • 원본 배열의 각 요소에 대해 제공된 결과 값으로 반환
const arr = [1, 2, 3];
const mappedArr = arr.map(x => x * 2);
console.log(mappedArr);  // [2, 4, 6]
console.log(arr);  // [1, 2, 3] (원본 배열은 변하지 않음)
  • 기존 원화로 가격을 표시한 부분을 달러로 변경
   $("#dollar").on('click', () => {
      let newPrice = products.map( a => {
        return {
          ...a,
          price: (a.price / exchangeRate).toFixed(2)
        } 
      })
      console.log(newPrice)
      row.html('');
      템플릿1(newPrice);
    })

  • 해당 객체에서 가격 부분을 달러로 변환
return (a.price / exchangeRate).toFixed(2)
  • 위와 같이 return 만 해주게 된다면 기존 객체에서 가격 정보만 새롭게 만들어 반환해 준다.
  • id, title은 제외 됨 객체로 반환 받고 싶다면 아래와 같이 해야 함
return {
          ...a, // 기존 객체를 복사(스프레드 연산자 사용)
          price: (a.price / exchangeRate).toFixed(2) 
        } 
  • price: 와 같이 해주게 되면 기존 객체에서 price만 부문만 변경하여, 새로운 객체를 생성하여 반환해준다.
  • 결과
[
    {
        "id": 1,
        "price": "37.65",
        "title": "Springfield Shirt"
    },
    {
        "id": 2,
        "price": "45.18",
        "title": "Black Monastery"
    },
    {
        "id": 0,
        "price": "52.71",
        "title": "Blossom Dress"
    }
]

 

 

 

filter

  •  filter()
    • 새로운 배열을 반환
    • 제공된 조건을 만족하는 원본 배열의 요소들만 추출하여 새로운 배열을 생성
const arr = [1, 2, 3];
const mappedArr = arr.map(x => x * 2);
console.log(mappedArr);  // [2, 4, 6]
console.log(arr);  // [1, 2, 3] (원본 배열은 변하지 않음)
  • filter를 사용해서 특정 가격 이하인 요소만 새로운 배열로 생성
$("#under").on('click', () => {
      let newProducts = products.filter( a => {
        return a.price <= 60000
      })
      row.html(''); // 기존 요소가 존재 할 수도 있기 때문에 요소를 비워준다.
      템플릿(newProducts);
    })
  • 결과
[
    {
        "id": 1,
        "price": 50000,
        "title": "Springfield Shirt"
    },
    {
        "id": 2,
        "price": 60000,
        "title": "Black Monastery"
    }
]

 

 

sort

  •  sort()
    • 원본 배열을 수정
    • 원본 배열을 정렬해주고, 새로운 배열을 반환하지 않음
    • 원본 배열 자체가 정렬된 상태로 변경
const arr = [3, 1, 4, 2];
const sortedArr = arr.sort((a, b) => a - b);
console.log(sortedArr);  // [1, 2, 3, 4]
console.log(arr);  // [1, 2, 3, 4] (원본 배열이 수정됨)
  • 가격 정렬 버튼
// 가격 정렬 버튼
$("#price").on('click', () => { 
      products.sort((a, b) => {
        return a.price - b.price;
      })
      row.html(''); 
      템플릿(products);
    })
  • sort((a,b) ⇒ { return a - b})
    • a, b 각 요소를 가르키는 요소
    • return a - b : 계산하여 양수면 a를 오른쪽 요소로 이동 음수라면 b를 오른쪽으로 이동
    • 양수인 경우는 a > b 크기 때문에 오름차순 정렬을 하기 위해서 a를 오른쪽으로 옮긴다.
    • 반대로 내림차순 정렬을 하려면 return b - a 로 작성
  • 결과
[
    {
        "id": 1,
        "price": 50000,
        "title": "Springfield Shirt"
    },
    {
        "id": 2,
        "price": 60000,
        "title": "Black Monastery"
    },
    {
        "id": 0,
        "price": 70000,
        "title": "Blossom Dress"
    }
]

결론

  • map()과 filter()는 새로운 배열을 생성하며, 원본 배열에는 영향을 주지 않습니다.
  • sort()는 원본 배열을 수정하며, 새로운 배열을 반환하지 않습니다.

'study > JavaScript' 카테고리의 다른 글

localStorage  (0) 2024.09.10
DOM(Document Object Model)  (0) 2024.09.09
상품 상세 페이지 Tab 버튼 만들기  (1) 2024.09.06