#ruby
Вопрос:
Скажите мне, как это сделать, где вы можете прочитать об этом, потому что я совсем не понимаю, как это реализовать. Спасибо.
def initialize @arr = [] end def items(init) arrfinish = init - @arr @arr = (@arr init).uniq yield arrfinish end def idefine(find_text) end
В классе есть метод(элементы), который соединяет массивы путем удаления повторяющихся элементов. Мне нужно убедиться, что метод idefine получает ключ, по которому будет выполняться фильтрация при добавлении новых элементов, я приведу пример ниже.
app_handler.idefine('id') app_handler.items([{'id' =gt; 1}, {'id' =gt; 1, 'test_key' =gt; 'Some data'}, {'id' =gt; 2}])
В этом примере второй элемент с идентификатором = 1 следует игнорировать.
Комментарии:
1. Действительно
'test_key' =gt; 'Some data'
ли это также удалено ?2. Да, весь объект удаляется.
3. Вы действительно
items
yield
чего-то хотите, и если да, то чего? (Вы не передаете блок в своем примере кода, и если вы даете только один раз, то вместо этого вы можете просто использовать возвращаемое значение.) Кроме того, можно ли с уверенностью предположить, чтоidefine
это не будет вызвано после добавления каких-либо элементов?
Ответ №1:
Хорошо, отложив в сторону определение класса, я понимаю, что в этом вопросе:
В массиве хэшей удалите хэши, содержащие повторяющееся значение данного ключа.
Следующая функция фильтрует хэши и копирует содержимое выбранных хэшей в новый массив:
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 lt;lt; hash[key] result lt;lt; hash.dup end end
Что дает вам:
no_dup_val 'id', [{'id' =gt; 1}, {'id' =gt; 1, 'key' =gt; 'data'}, {'id' =gt; 2}, {'stock' =gt; 3}, {'e-stock'=gt;0}] #=gt; [{"id"=gt;1}, {"id"=gt;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' =gt; 1}, {'id' =gt; 1, 'key' =gt; 'data'}, {'id' =gt; 2}, {'stock' =gt; 3}, {'e-stock'=gt;0}] #=gt; [{"id"=gt;1}, {"id"=gt;2}]
- Хэши без
id
ключа рассматриваются как имеющие"id" =gt; nil
(поэтому первый будет сохранен):
def no_dup_val key, arr arr.uniq{ |h| h[key] } end no_dup_val 'id', [{'id' =gt; 1}, {'id' =gt; 1, 'key' =gt; 'data'}, {'id' =gt; 2}, {'stock' =gt; 3}, {'e-stock'=gt;0}] #=gt; [{"id"=gt;1}, {"id"=gt;2}, {"stock"=gt;3}]
- Все хэши без
id
ключа сохраняются: