Как отклонить элемент из массива, который также содержит хеши, в Ruby? - PullRequest
0 голосов
/ 17 июня 2020

Например:

hash_var = ["1", "2", {"a" => ["aa", "bb", "cc"]}]
reject(hash_var, "1")             # should return ["2", {"a" => ["aa", "bb", "cc"]}]
reject(hash_var, "a")             # should return ["1", "2"]
reject(hash_var, {"a" => ["aa"]}) # should return ["2", {"a" => ["bb", "cc"]}]

По сути, я должен иметь возможность отклонить элемент из массива, будь то sh или элемент массива.

Ответы [ 4 ]

0 голосов
/ 17 июня 2020

Думаю, этот метод должен работать:

def reject(hash_var, ele)
  # Find the index of the ele
  # If it is found, just remove it and return hash_var
  idx = hash_var.index(ele)
  if idx
    hash_var.delete_at(idx)
    return hash_var
  end

  # Convert the hashes to arrays - 2D arrays
  # { "b" => "2" } becomes [["b", "2"]]
  (0...hash_var.length).each do |n|
    if hash_var[n].class == Hash
      hash_var[n] = hash_var[n].to_a
    end
  end

  (0...hash_var.length).each_with_index do |n, i|
    # Only operate if hash_var[n] is an array
    # this means that this is 2D array i.e. hash
    if hash_var[n].class == Array
      # If this is just as element, delete the whole hash_key
      # i.e. reject(hash_var, "a")
      # here ele = "a", so since this is not hash
      # we need to delete full element i.e. ["aa", "bb", "cc"]
      if hash_var[n][0][0] == ele
        hash_var.delete_at(i)
      else
        next if ele.class == String
        ele_a = ele.to_a
        if hash_var[n][0][0] == ele_a[0][0]
          diff = hash_var[n][0][1] - ele_a[0][1]
          hash_var[n][0][1] = diff
        end
      end
    end
  end

  ## Convert the 2D arrays back to hashes
  (0...hash_var.length).each do |n|
    if hash_var[n].class == Array
      hash_var[n] = hash_var[n].to_h
    end
  end

  # return final
  return hash_var
end

Тесты:

hash_var = ["1", "2", {"a" => ["aa", "bb", "cc"]}]
p reject(hash_var, "1")
# => ["2", {"a"=>["aa", "bb", "cc"]}]

p reject(hash_var, "a")
# => ["1", "2"]

p reject(hash_var, {"a" => ["aa"]})
# => ["1", "2", {"a"=>["bb", "cc"]}]
0 голосов
/ 17 июня 2020

Это должно сработать

hash_var.drop_while { |e| e == '1' }
hash_var.reject { |e| e == '1' }
hash_var.find_all { |e| e != '1' }
hash_var.select { |e| e != '1' }
0 голосов
/ 17 июня 2020

Вы можете определить метод экземпляра Enumerable#dig_drop:

arr = ["1", "2", {"a" => ["aa", "bb", "cc"]}, {"b" => ["aa", "bb"]}]

module Enumerable
  def dig_drop(*elm)
    self.each_with_index {|_, idx|
      unless self[idx].respond_to? :dig
        self.delete(elm[0])
        next
      end
      last=elm.pop
      if elm.empty?
        self[idx].delete(last)
      else
        self[idx].dig(*elm).nil? ? nil : self[idx].dig(*elm).delete(last)
      end
    }
    self.reject!(&:empty?)
  end
end

arr.dig_drop "1"         # arr equals ["2", {"a" => ["aa", "bb", "cc"]}, {"b" => ["aa", "bb"]}]
arr.dig_drop('a')        # arr equals ["2", {"b" => ["aa", "bb"]}]  
arr.dig_drop('b', 'bb')  # arr equals ["2", {"b" => ["aa"]}
0 голосов
/ 17 июня 2020

вы можете использовать метод удаления на ha sh например

hash_var = ["1", "2", {"a" => ["aa", "bb", "cc"]}]
hash_var.delete("1") //this will delete 1 from hash then new value of hash will be ["2", {"a"=>["aa", "bb", "cc"]}]
hash_var[1]["a"].delete("aa") //this will give output ["2", {"a"=>["bb", "cc"]}]

и так далее в зависимости от вашего использования

...