【问题标题】:Remove element from an array of objects and create array of hash从对象数组中删除元素并创建哈希数组
【发布时间】:2017-11-06 22:52:09
【问题描述】:

用详细的例子重写问题:

我有一个具有三个属性的对象数组,我想构建一个苛刻的数组,并且生成的哈希没有@name 实例属性。我用一个例子模拟了这个问题。

示例创建

class Employee
  attr_accessor :name, :company, :duration
  def initialize(name, company, duration)
    @name     = name
    @company   = company
    @duration = duration
  end
end

aSong1 = Employee.new("Fleck", "AMZ", 260)
aSong2 = Employee.new("Taylor", "EMC", 120)
aSong3 = Employee.new("Bob", "Adobe", 260)
aSong4 = Employee.new("Jack", "Google", 360)

final_array = [ ]
final_array.push(aSong1)
final_array.push(aSong2)
final_array.push(aSong3)
final_array.push(aSong4)

控制器

puts final_array.length #4
final_array.each do | element | 
  puts element.is_a?(Object) #true
  puts element.name #prints name
end

结果数组(预期)

result = [{company: 'AMZ',duration: 260}, {company: 'EMC',duration: 120},{company: 'Adobe',duration: 260}, {company: 'Google',duration: 360}  ]

示例:repl

【问题讨论】:

  • 你确定这不是应该在数据库中完成的事情,而不是拉出一堆数据并在 Ruby 中对其进行排序吗?
  • 我现在正试图在控制器中处理这个问题,因为它在数据库端有很多依赖项需要改变。
  • 它也很不清楚您所说的“在下一步中我想将此对象数组与哈希数组(例如:比较)进行比较以查看是否找到任何匹配以更新名称”。输入是什么,输出应该是什么?
  • 可以通过@user_data.map {|h| h.except("id") }删除id
  • @我的意思是,一旦 id 被删除,我想将结果与example: compare 代码 sn-p 进行比较,以查找是否有任何匹配项

标签: ruby-on-rails arrays ruby hash


【解决方案1】:

您可以使用

删除 id 键
 a = [{"id":"21","company":"AMC","name":"Matt"},{"id":"22","company":"AMC","name":"Jon"},
{"id":"12","company":"XYZ","name":"Bob"}].each{|o| o.delete :id}

如果你想将它与其他哈希进行比较,你可以使用合并方法,假设 a2 是第二个哈希

a.merge(a2)

这将返回一个新的散列,其中任何匹配的键都使用来自第二个散列的新对应值更新

【讨论】:

  • o.delete "id"
  • 我厌倦了它,因为某种原因它不起作用:/ 虽然提供参数作为符号完成了这项工作
  • @yassine2020 undefined method delete' for #<:dataentry:0x007fe9ba061638>`
  • 确保您在数组中获取哈希
  • entry.is_a?(Object) # =&gt; true
【解决方案2】:
final_array.collect {|x| { company: x.company, duration: x.duration }}

结果:

[{:company=>"AMZ", :duration=>260}, {:company=>"EMC", :duration=>120}, {:company=>"Adobe", :duration=>260}, {:company=>"Google", :duration=>360}]

【讨论】:

    【解决方案3】:

    下面的呢?

    class Employee
      def to_h
        instance_variables.each_with_object({}) do |var, h|
          k = var.to_s.tr('@','').to_sym
          v = instance_variable_get(var)
          h[k] = v
        end
      end
    end
    
    result = final_array.map{|e| e.to_h.delete_if{|k,v| k == :name}}
    

    【讨论】:

      猜你喜欢
      • 2011-12-13
      • 1970-01-01
      • 1970-01-01
      • 2020-01-31
      • 1970-01-01
      • 2015-11-13
      • 2022-01-07
      • 1970-01-01
      • 2019-04-08
      相关资源
      最近更新 更多