告訴我如何做到這一點,你可以在哪里閱讀它,因為我根本不明白如何實作它。謝謝。
def initialize
@arr = []
end
def items(init)
arrfinish = init - @arr
@arr = (@arr init).uniq
yield arrfinish
end
def idefine(find_text)
end
該類有一個方法(items),它通過洗掉重復元素來連接陣列。我需要確保 idefine 方法接收到添加新元素時將執行過濾的鍵,我將在下面給出示例。
app_handler.idefine('id')
app_handler.items([{'id' => 1}, {'id' => 1, 'test_key' => 'Some data'}, {'id' => 2}])
在此示例中,應忽略 id = 1 的第二個元素。
uj5u.com熱心網友回復:
好的,撇開類定義不談,我對這個問題的理解是:
在散列陣列中,洗掉包含給定鍵重復值的散列。
以下函式過濾散列并將所選散列的內容復制到新陣列中:
require 'set'
def no_dup_val key, arr
previous_values = Set[]
arr.each_with_object([]) do |hash,result|
next unless hash.has_key?(key)
next if previous_values.include?(hash[key])
previous_values << hash[key]
result << hash.dup
end
end
這給了你:
no_dup_val 'id', [{'id' => 1}, {'id' => 1, 'key' => 'data'}, {'id' => 2}, {'stock' => 3}, {'e-stock'=>0}]
#=> [{"id"=>1}, {"id"=>2}]
請注意,不包含密鑰的散列也將被洗掉,這是我的選擇,這會導致以下問題:
- 當密鑰不存在于散列中時會發生什么?
- 當
item函式被多次呼叫時會發生什么?您是否考慮了已經包含的哈希值@arr? - 當您
idefine使用新密鑰呼叫時會發生什么?您是否@arr使用新鍵過濾現有元素?
如您所見,您需要更具體地了解您想要做什么。
更新
如果您不關心復制散列的內容,那么這些可能適合您的需要。
id洗掉沒有鍵的哈希:
def no_dup_val key, arr
arr.filter{ |h| h.has_key?(key) }.uniq{ |h| h[key] }
end
no_dup_val 'id', [{'id' => 1}, {'id' => 1, 'key' => 'data'}, {'id' => 2}, {'stock' => 3}, {'e-stock'=>0}]
#=> [{"id"=>1}, {"id"=>2}]
- 沒有
id鍵的哈希被視為具有"id" => nil(所以第一個將被保留):
def no_dup_val key, arr
arr.uniq{ |h| h[key] }
end
no_dup_val 'id', [{'id' => 1}, {'id' => 1, 'key' => 'data'}, {'id' => 2}, {'stock' => 3}, {'e-stock'=>0}]
#=> [{"id"=>1}, {"id"=>2}, {"stock"=>3}]
id保留所有沒有密鑰的哈希:
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/342935.html
標籤:红宝石
