Фильтрация при добавлении элементов по идентификатору

#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 с помощью нового ключа?

Как вы можете видеть, вам нужно быть немного более конкретным в том, что вы хотите сделать.


Обновить

Если вы не заботитесь о копировании содержимого хэшей, то они могут соответствовать вашим потребностям.

  1. Хэши без 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}]  
  1. Хэши без 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}]  
  1. Все хэши без id ключа сохраняются: