Ruby 배열 : select (), collect () 및 map ()


106

매핑 구문 :

a = ["a", "b", "c", "d"]      #=> ["a", "b", "c", "d"] 
a.map {|item|"a" == item}     #=> [true, false, false, false] 
a.select {|item|"a" == item}  #=> ["a"]

다음 사항이 있는지 질문하십시오.

 irb(main):105:0> details[1]
 => {:sku=>"507772-B21", :desc=>"HP 1TB 3G SATA 7.2K RPM LFF (3 .", :qty=>"", 
 :qty2=>"1", :price=>"5,204.34 P"}

이 배열에 빈 수량 값이있는 모든 항목을 삭제하거나 일부 값이있는 항목 만 선택하고 싶습니다.

나는 시도했다 :

details.map {|item|"" == item}

많은 거짓을 반환 한 다음 동일한 맵을 사용하여 선택하면 다음을 얻습니다.

[]

당신이 자세히 보면이 해시의 배열처럼, 그것은 본다
에밀리

@Emily : 아주 사실입니다. 방금 깨달았습니다. 마지막 코드 샘플은 :qty거기에 나타나지 않기 때문에 다르게 생각하게 만들었습니다 .
Niklas B.

답변:


131

details해시 배열 처럼 보입니다 . 따라서 item블록 내부에는 전체 해시가 있습니다. 따라서 :qty키 를 확인 하려면 다음과 같은 작업을 수행합니다.

details.select{ |item| item[:qty] != "" }

그러면 :qty키가 빈 문자열이 아닌 모든 항목이 제공됩니다 .

공식 선택 문서


26

편집 : 방금 details해시 배열 인 필터링하고 싶다는 것을 깨달았습니다 . 이 경우 당신은 할 수 있습니다

details.reject { |item| item[:qty].empty? }

내부 데이터 구조 자체는 배열이 아니라 해시입니다. select여기 에서도 사용할 수 있지만이 경우 블록에 키와 값이 제공됩니다.

irb(main):001:0> h = {:sku=>"507772-B21", :desc=>"HP 1TB 3G SATA 7.2K RPM LFF (3 .", :qty=>"", :qty2=>"1", :price=>"5,204.34 P"}
irb(main):002:0> h.select { |key, value| !value.empty? }
=> {:sku=>"507772-B21", :desc=>"HP 1TB 3G SATA 7.2K RPM LFF (3 .", 
    :qty2=>"1", :price=>"5,204.34 P"}

또는 (주어진 조건이 유지되는 모든 항목을 제외 reject)의 역인을 사용 select합니다.

h.reject { |key, value| value.empty? }

이것은 Ruby 1.9입니다. 1.8과의 호환성을 유지해야하는 경우 다음을 수행 할 수 있습니다.

Hash[h.reject { |key, value| value.empty? }]

@ingalcala : 내 대답이 실제로 필요한 것이 아니라는 것을 깨달았습니다. details배열 자체 를 필터링하는 방법에 대한 내 편집을 확인하십시오 .
Niklas B.

9

해시를 처리 할 때 .NET {}내부의 블록에 키와 값을 모두 사용합니다 ||.

details.map {|key,item|"" == item}

=>[false, false, true, false, false]
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.