문자열을 키로하고 AR 개체를 값으로 사용하여 .group_by
메서드로 만든 해시가 있습니다. 그리고 복제 된 필드가있는 AR 객체 을 제거하고 싶습니다 (다른 필드는 동일하거나 다를 수 있음).그룹화 된 해시의 고유 개체
나는이 조각 만든 질문 명확히하기 위해 여기
require 'ostruct'
def os_new(fid); OpenStruct.new(fid: fid, rand: rand(100)); end
a = [os_new(1), os_new(2), os_new(3)]
b = [os_new(3), os_new(3), os_new(2)]
c = [os_new(5), os_new(5), os_new(5), os_new(5)]
grouped_hash = { a: a, b: b, c: c}
grouped_hash
것은 :
# {:a=>[#<OpenStruct fid=1, rand=7>, #<OpenStruct fid=2, rand=50>, #<OpenStruct fid=3, rand=13>],
# :b=>[#<OpenStruct fid=3, rand=51>, #<OpenStruct fid=3, rand=58>, #<OpenStruct fid=2, rand=88>],
# :c=>[#<OpenStruct fid=5, rand=40>, #<OpenStruct fid=5, rand=8>, #<OpenStruct fid=5, rand=45>, #<OpenStruct fid=5, rand=72>]}
이제 결과에서 나는 각각의 키에 대해 고유 한 fid
s의 해시를 원하는 :
# {:a=>[#<OpenStruct fid=1, rand=7>, #<OpenStruct fid=2, rand=50>, #<OpenStruct fid=3, rand=13>],
# :b=>[#<OpenStruct fid=3, rand=51>, #<OpenStruct fid=2, rand=88>],
# :c=>[#<OpenStruct fid=5, rand=40>]}
내 솔루션에는 여러 가지 동작이 필요하며보기가 복잡합니다.
grouped_hash.each_value do |value|
fids = []
value.delete_if do |object|
if fids.include? object.fid
true
else
fids << object.fid
false
end
end
end
가장 우아한 (가능한 한 1 라이너) 효율적인 방법 (해시 다시 만들기 없음)을 찾고 있습니다.
I을 'id'가 혼란스러워하지 않고 각 객체에 다른 필드가 있다는 것을 증명하기 위해 질문을 업데이트했습니다. 그래서'uniq'는 작동하지 않을 것입니다. –
'uniq (& : fid)'는 어떻습니까? (업데이트 된 답변) – katafrakt
감사합니다! 나는 아이디어를 얻었다! 당신의 해법은 해시를 재현하기 때문에 @Tensho와 결합하여 답을하고 싶습니다. –