sort_by, min_by, max_by
Coddy Ruby 여정의 로직 및 흐름 섹션에 포함된 레슨 — 56개 중 26번째.
여러분은 이미 sort, min, 그리고 max를 알고 있습니다. _by 버전은 무엇을 비교할지에 대한 제어권을 제공하여, 구조화된 데이터를 정렬하는 데 완벽합니다.
sort_by는 블록을 받습니다. 블록은 각 요소에 대해 비교할 값을 반환합니다:
words = ["banana", "hi", "hello"]
by_length = words.sort_by { |w| w.length }
puts by_length.inspect # ["hi", "hello", "banana"]내림차순의 경우, 숫자에 대해 비교 키를 부정(-w.length)하거나 결과에 reverse를 호출하세요.
min_by와 max_by는 블록에서 가장 작거나 큰 값을 가진 단일 요소를 반환합니다:
people = [
{ name: "Ada", age: 36 },
{ name: "Bob", age: 22 },
{ name: "Cara", age: 41 }
]
youngest = people.min_by { |p| p[:age] }
oldest = people.max_by { |p| p[:age] }
puts youngest[:name] # Bob
puts oldest[:name] # Cara단축 표기법도 작동합니다: words.sort_by(&:length).
챌린지
중급products 배열이 주어지며, 각 요소는 :name, :price, 그리고 :quantity를 키로 가지는 해시입니다. 각 상품의 재고 가치(stock value)는 price * quantity입니다.
다음 세 줄을 출력하세요:
- 재고 가치를 기준으로 내림차순 정렬된 이름들을
,로 연결하여 출력 (계산된 값에sort_by사용) - 가격이 5 미만인 항목 중 수량이 가장 많은 상품의 이름 (필터링된 리스트에
max_by사용) - 수량이 최소 10개 이상인 상품 중 가장 저렴한 상품의 이름 (필터링된 리스트에
min_by사용)
기본 배열에 대한 출력 결과는 다음과 같습니다:
cheese, milk, bread, apple
bread
bread직접 해보기
products = [
{ name: "milk", price: 3, quantity: 8 },
{ name: "apple", price: 1, quantity: 4 },
{ name: "cheese", price: 5, quantity: 6 },
{ name: "bread", price: 2, quantity: 12 }
]
# TODO: 재고 가치 기준 내림차순 정렬; 수량 기준 최대값 (가격 < 5); 가격 기준 최소값 (수량 >= 10)
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
로직 및 흐름의 모든 레슨
5Enumerable의 강력한 기능
Select와 RejectMap 체이닝Reduce / Injectcount, all?, any?, none?group_by와 partitionsort_by, min_by, max_by요약 - 데이터 파이프라인