[javscript][알고리즘] filter 함수 질문
조회수 709회
안녕하세요. 아래의 코드는
people과 tshirts 배열은 모두 오름차순으로 정렬되어있고
- people 배열의 원소 person이 tshirts 배열의 원소들보다 같거나 작으면 ,
- person과 대응된 tshirts 배열의 원소를 삭제하고
- 조건에 맞는 person을 fp라는 배열로 만든다음
- 배열의 길이를 리턴하는 함수입니다.
const fp = people.filter(person => {
for(let item of tshirts){ // tshirt 배열에서 person을 찾는 경우 배열 값변경
if(person <= item){
tshirts.splice(tshirts.indexOf(item),1)
return person <= item;
}
}
});
return fp.length;
사실 제가 찾고 싶은것은 tshirts 배열의 원소보다 작거나 같은 peson 배열의 원소들
인데요. 어떻게 찾을까 고민하던중에 1. 조건에 맞는 배열을 만들고 2. 배열의 길이를 리턴하자 라는 생각이 들었고, 조건에 맞는 배열을 만드려면 filter 메소드를 사용하는것이 가장 좋은 방법인것 같아 위와 같은 코드를 작성하였습니다.
그런데 filter 함수는 보통 아래와 같이 return 을 생략하고 조건에 맞는배열만 바로 뽑아낼때 가장 사용성이 좋은데
const result = words.filter(word => word.length > 6);
제가 짠 코드에서는
- return 생략이 되지 않고
- filter 함수 내부에서 tshirts 배열을 계속 변경해줍니다.
그래서 ... 원하는 동작은 하지만, 더 좋은 방법이 있지 않을까 해서 질문을 드립니다.
배열에서 조건에 맞는 배열을 뽑아내기 위해서 reduce , map ,filter 와 같은 함수들을 잘 써주어야하는것으로 알고있는데요. 이 경우에 filter 함수를 사용하는것이 최선일까요? 어떻게 하면 좀 더 깔끔하고 아름다운(?) 코드를 작성할 수 있을지 여쭤보고싶습니다.
질문 읽어주셔서 감사합니다! :)
-
(•́ ✖ •̀)
알 수 없는 사용자
1 답변
-
기법이 중요한 경우도 있고 해당 기법이 문제를 단순화 해 줄 수 있는 경우도 있지만
제가 코드를 보기엔 filter라는 함정에 빠져서 주석이 아니면 의도를 파악하기 힘든 코드를 짜신건 아닌가 싶네요.
그냥 이중 for문에 추가적으로 적절한 이름의 변수를 더 두더라도 코드 자체만 봐도 이해하기 쉬운 코드가 더 좋다고 생각합니다. 특히나 혼자 개발하는 상황이 아니라면 말이죠.
- 정확하게 질문의 답이 아닌건 죄송합니다. 다만 마지막에 깔끔하고 아름다운 코드를 작성하는데 고심하시는 것 같아서 제가 아름다운 코드라고 생각하는 것에 대해 짧게 적어봤습니다. doodoji 2019.2.25 14:11
- 아직 JS 문법에 익숙하지 않아 map , filter , reduce 를 잘 쓰고싶어서 웬만하면 코드를 짤때 단순 for문이 아닌방법을 생각해서 짜고있는데요 ㅎㅎ.. 저도 다른사람이 알아보기 좋은 코드가 제일 좋은 코드인것같네요 ㅎㅎ 답변감사합니다! 알 수 없는 사용자 2019.2.26 09:41
댓글 입력