JS 임의의 순서로 배열 재정렬

불꽃남자·2022년 5월 3일
0
post-thumbnail

계기

제목대로 임의의 순서로 배열을 재정렬 해야 할 일이 생겼다.

위는 구현해야 할 장비의 상세정보의 일부이다.
현재 구현 중인 부분은 해당 장비의 세트 효과를 가진 장비의 장착 현황을 나타내는 부분이다. API에 정보를 요청하면 다음과 같은 형태로 응답이 온다.

여기서 문제와 마주쳤다.
세트 효과 장비의 순서는 머리, 어깨, 상의, 하의, 장갑, 무기 이다. 그럼 위의 배열을 어떻게 임의의 순서로 정렬한단 말인가?

어떻게?

  1. 결국 결과값은 하나의 배열이어야 하니깐 일단은 두 배열을 합쳐주었다.
[
	...equipment.set.setItemEnableList,
	equipment.set.setItemDisableList,
].flat();
  1. 그 다음 정렬을 해야하는데, 나는 1시간 고민한 뒤 다음과 같이 정렬에 성공했다.
[
  ...equipment.set.setItemEnableList,
  equipment.set.setItemDisableList,
]
  .flat()
  .sort((a, b) => {
    let aOrder = 0;
    let bOrder = 0;

    if (a.includes("머리")) aOrder = 0;
    else if (a.includes("어깨")) aOrder = 1;
    else if (a.includes("상의")) aOrder = 2;
    else if (a.includes("하의")) aOrder = 3;
    else if (a.includes("장갑")) aOrder = 4;
    else aOrder = 5;

    if (b.includes("머리")) bOrder = 0;
    else if (b.includes("어깨")) bOrder = 1;
    else if (b.includes("상의")) bOrder = 2;
    else if (b.includes("하의")) bOrder = 3;
    else if (b.includes("장갑")) bOrder = 4;
    else bOrder = 5;

    return aOrder - bOrder;
  })

각각의 요소를 if문으로 구별해낸 뒤 임의의 순서를 매겨줘서 정렬에 성공했다.

좀 더 우아한 방법을 상상하고 이것저것 해보았는데, 하면 할 수록 점점 코드가 더러워졌다. sort 메서드를 사용하지 않고 배열의 순서를 바꾸려면 splice 메서드를 사용해야 하는데, 그렇게 하니 코드가 점점 더 알아보기 힘들어졌다. splice 메서드를 사용한 배열 재정렬은 지금과 같은 상황에선 좋지 못했다.

profile
프론트엔드 꿈나무, 탐구자.

0개의 댓글