0
mydata = {:data => [
        {
        :first_name = > "abc",
        :foo_id = > "21sd",
        :roll = > 43
        }, 
        {:first_name = > "def",
        :foo_id = > "2uf",
        :roll = > 81
        }, 
        {:first_name = > "xyz",
        :foo_id = > "ac32",
        :roll = > 2
        }
    ]
}

mydataで:rollはどういうわけか破損した値を持っています

私はソートされたハッシュを持っています、これは次のようなデータを持っています:foo_id => :roll

sorted = {"21sd" => 7, "ac32" => 89, "2uf" => 92}

(つまり、:rollの正しい値を昇順で並べ替えます)

そして、この「ソートされた」ハッシュを使用して「mydata」を再配置し:roll、「mydata」の値を「sorted」ハッシュからの正しい値でオーバーライドしたいと思います。したがって、最終的に「mydata」は次のようになります。

mydata = {:data => [
        {
        :first_name = > "abc",
        :foo_id = > "21sd",
        :roll = > 7
        }, 
        {:first_name = > "xyz",
        :foo_id = > "ac32",
        :roll = > 89
        },
        {:first_name = > "def",
        :foo_id = > "2uf",
        :roll = > 92
        }
    ]
}

UPADTE:: rollはソートされたもので一意でない可能性があります

mydataに100,000個のハッシュがある可能性があることを考慮してください

'sorted'のネストされたループを使用して結果を達成し、各反復で'mydata'からfoo_idを検索し、値を修正して、ソートされたデータを新しい変数に格納しました。これは醜いです。

correct = []
sorted.each {|k, v|
    mydata[:data].each {|h| # hate looping here
        if h[:foo_id] == k  # hate searching here, if i have 100,000 record in 'mydata'
            h[:roll] = v
           correct << h 
        end
    }
}
mydata = {:data => correct}

mydataに多数のデータセットが含まれている場合、これは最適なソリューションではありません。誰かがいくつかの最適な解決策を提案しますか?

4

2 に答える 2

2

これはうまくいくはずです...

mydata[:data].each do |h|
  h[:roll] = sorted[h[:foo_id]]
end

mydata [:data]は配列であるため、ループを回避する方法はありませんが、新しい変数に何かを詰め込む必要はありません。取得したものを更新するだけです。

私が問題を理解していない限り...

編集:私はソートの権利を取得していませんでした。新しいソリューション:

mydata[:data].each do |h|
  h[:roll] = sorted[h[:foo_id]]
end
mydata[:data].sort_by!{|h| h[:roll]}
于 2012-11-29T23:54:18.713 に答える
0
data =  [
        {
        :first_name => "abc",
        :foo_id => "21sd",
        :roll => 7
        },
        {:first_name => "xyz",
        :foo_id => "ac32",
        :roll => 89
        },
        {:first_name => "def",
        :foo_id => "2uf",
        :roll => 92
        }
    ]

sorted = {"21sd" => 7, "ac32" => 89, "2uf" => 92}

foo_id_name = data.map do |rec|
    { rec[:foo_id] =>  rec[:first_name] }
end.reduce(&:merge)

new_data = sorted.map do |foo_id, new_roll|
    {
        :first_name => foo_id_name[foo_id],
        :foo_id => foo_id,
        :roll => new_roll
    }
end

puts new_data.inspect #=> [{:first_name=>"abc", :foo_id=>"21sd", :roll=>7}, {:first_name=>"xyz", :foo_id=>"ac32", :roll=>89}, {:first_name=>"def", :foo_id=>"2uf", :roll=>92}]
于 2012-11-30T00:17:03.650 に答える