【问题标题】:Efficient way to update values to array of hashes in ruby?在ruby中将值更新为哈希数组的有效方法?
【发布时间】:2017-11-05 15:05:33
【问题描述】:

我有一个哈希数组,如下所示:

items = [ {"id" => 1, "cost" => '2.00'}, 
          {"id" => 2, "cost" => '6.00'}, 
          {"id" => 1, "cost" => '2.00'},
          {"id" => 1, "cost" => '2.00'}, 
          {"id" => 1, "cost" => '2.00'} ]

我想更新cost to '8.00',其中id = 1。我已尝试使用如下的each 方法,该方法确实有效,但我想知道是否有另一种更有效的更新值的方法?

items.each { |h| h["cost"] = "8.00" if h["id"] == 1 }

【问题讨论】:

  • 在最坏的情况下搜索数组中的记录需要nn => 数组中的元素数)步骤。一种更有效的方法是使用不同的数据结构——例如一个哈希值,其中 id 是键,值是成本。只需一步即可找到要更新的元素。使用散列而不是带有嵌套散列的数组是一种选择吗?
  • 谢谢,@spickermann 正如你所说,我想避免使用N + 1 each 方法,我想知道任何应该有效的方法。所以请随意使用哈希
  • 您的数据结构中有重复项。你需要它们吗?如果是,为什么要更新所有相同的成本呢?每个ID只有一个条目就足够了吗?还是一个条目存储条目数和一个成本?
  • 是的,我需要副本,因为我想计算总成本。此外,这些物品基本上就像一个购物车。所以我想计算总成本。
  • “我尝试了每种方法” - 请展示你的尝试。

标签: arrays ruby ruby-hash


【解决方案1】:

你可以使用相同的对象:

item_1 = {'id' => 1, 'cost' => '2.00'}
item_2 = {'id' => 2, 'cost' => '6.00'}

items = [item_1, item_2, item_1, item_1, item_1]
#=> [{"id"=>1, "cost"=>"2.00"}, {"id"=>2, "cost"=>"6.00"},
#    {"id"=>1, "cost"=>"2.00"}, {"id"=>1, "cost"=>"2.00"},
#    {"id"=>1, "cost"=>"2.00"}]

这使得更新变得微不足道:

item_1['cost'] = '8.00'

items
#=> [{"id"=>1, "cost"=>"8.00"}, {"id"=>2, "cost"=>"6.00"},
#    {"id"=>1, "cost"=>"8.00"}, {"id"=>1, "cost"=>"8.00"},
#    {"id"=>1, "cost"=>"8.00"}]

【讨论】:

  • 您能再解决一个问题吗?
  • 哇。我不知道哈希可以做到这一点。为什么将原始变量设置为另一个变量时不会发生这种情况?
  • @teddybear 我不确定你的意思。能举个例子吗?
  • 我的问题得到了答案here
【解决方案2】:

您可能会考虑从以下位置更改数据结构:

items = [{"id" => 1, "cost" => '2.00'}, {"id" => 2, "cost" => '6.00'}, 
         {"id" => 1, "cost" => '2.00'}, {"id" => 1, "cost" => '2.00'}, 
         {"id" => 1, "cost" => '2.00'}]

像这样的哈希:

items = { 1 => '2.00', 2 => '6.00' }

使用id = 1 更新记录到8.00 调用:

items[1] = '8.00'

或者如果您需要知道项目的数量,您可能需要考虑这样的结构:

items = { 1 => ['2.00', 4], 2 => ['6.00', 1] }

比这样更新:

items[1][0] = '8.00'

【讨论】:

  • 确实如此。更重要的是,我会将 cost 保留为整数。
【解决方案3】:

您可以通过使用 each on 数组来实现这一点

items.each{|v| v["cost"] = "8.00" if v["id"] == 1 }

干杯!

【讨论】:

  • 只需使用each
  • v 是块变量名称的奇怪选择。 hashh 会更合适。
  • @Stefan 谢谢,.each 的答案比 @jaspreet 好吗?
  • @Vinay 如果您对它的返回值感兴趣,可以使用map
猜你喜欢
  • 2015-09-10
  • 1970-01-01
  • 2015-09-15
  • 2015-10-15
  • 2010-12-11
  • 1970-01-01
  • 2011-12-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多