Arrays 在ruby中更新哈希数组值的有效方法?

Arrays 在ruby中更新哈希数组值的有效方法?,arrays,ruby,ruby-hash,Arrays,Ruby,Ruby Hash,我有一个如下所示的哈希数组: 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 = [ {"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'} ]
我想将成本更新为'8.00',其中id=1。我已经尝试过下面的每种方法,它们确实有效,但我想知道是否还有其他更有效的方法来更新值

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

<>你可以考虑从

改变你的数据结构
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' }
items = { 1 => ['2.00', 4], 2 => ['6.00', 1] }
items[1][0] = '8.00'
要将id=1的记录更新为8.00,请调用:

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

items = { 1 => '2.00', 2 => '6.00' }
items = { 1 => ['2.00', 4], 2 => ['6.00', 1] }
items[1][0] = '8.00'
而不是像这样更新:

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

您可以通过使用阵列上的每个

items.each{|v| v["cost"] = "8.00" if v["id"] == 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"}]

在数组中搜索记录需要n=>最坏情况下数组步骤中的元素数。更有效的方法是使用不同的数据结构——例如,使用id为键、值为代价的散列。这只需要一步就可以找到要更新的元素。使用散列而不是嵌套散列的数组是一种选择吗?谢谢,@spickermann,正如你所说的,我想避免N+1 each方法,我想知道任何有效的方法。因此,请随意使用哈希表,因为您的数据结构中存在重复项。你需要它们吗?如果是,为什么要将所有更新为相同的成本?每个id只有一个条目就足够了吗?或者一个条目存储条目数量和一个成本?是的,我需要副本,因为我想计算总成本。此外,这些物品基本上就像一辆购物车。所以我想计算总成本。我尝试了每种方法–请展示您的尝试。只需使用每种方法。对于块变量的名称,v是一个奇怪的选择。哈希或h更合适。@Stefan谢谢,是的。每一个都比@jaspreet answer?@Vinay好。如果您对其返回值感兴趣,您可以使用map。确实如此。还有,我会用整数把成本保持为美分。请你再澄清一个问题好吗?哇。我不知道哈希可以做到这一点。当你把一个原始变量设置成另一个变量时,为什么不发生这种情况?@teddybear我不知道你的意思。你能举个例子吗?我得到了我问题的答案