관리 메뉴

꾸준히 합시다

Array.prototype.sort() 특정 기준으로 정렬하기 + Sequelize ORM 본문

자바스크립트 기초

Array.prototype.sort() 특정 기준으로 정렬하기 + Sequelize ORM

tturbo0824 2022. 7. 21. 09:00

프론트에서 상품 결제를 요청할 때 해당 상품의 현재 상태를 조회하기 위해 아래와 같은 코드를 작성했다.

let itemList = await Item.findAll({
  where: {
    itemName: itemNames
  },
  attributes: ['id', 'itemName', 'stock', 'sold', 'status']
});

itemNames는 결제를 원하는 상품의 이름만 담긴 배열인데, 프론트에서 보낸 전체 상품 정보 객체 배열에서 각 상품의 이름만 따로 저장한 것이다. (예: ['토스터기', '무선 게이밍 마우스'])

 

해당 상품만 조회하는 것까지는 문제 없었지만, 결괏값이 itemNames의 index 순이 아니라 DB에 저장된 해당 상품의 id 순으로 정렬이 되어 나온 것이 문제였다. 만약 오름차순이나 내림차순 정렬이라면 asc이나 des 키워드로 손쉽게 정렬을 할 수 있었겠지만 특정한 기준을 가지고 정렬하는 건 Sequelize ORM에 내장되어 있는 기능은 아닌 듯했다

// 조회 결괏값 (Item 테이블에 저장된 id순으로 정렬)
[
  { id: 7, itemName: '무선 게이밍 마우스', stock: 8, sold: 2, status: '판매중' },
  { id: 13, itemName: '토스터기', stock: 0, sold: 8, status: '품절' }
]

// 원하는 값 (id순이 아니라 itemNames의 index순으로 정렬)
[
  { id: 13, itemName: '토스터기', stock: 0, sold: 8, status: '품절' },
  { id: 7, itemName: '무선 게이밍 마우스', stock: 8, sold: 2, status: '판매중' }
]

 

원하는 결괏값을 얻기 위해 아래와 같이 Array.prototype.sort()를 이용했다.

itemList.sort((a, b) => itemNames.indexOf(a.itemName) - itemNames.indexOf(b.itemName));

 

Comments