Arrays 从其他数组更新哈希值数组

Arrays 从其他数组更新哈希值数组,arrays,ruby,hash,Arrays,Ruby,Hash,我有一个杂烩: { "grey" => ["anf_94748_01_prod1", "anf_94748_01_model1", "anf_94748_01_model2"], "heather blue" => ["anf_106537_01_prod1", "anf_106537_01_model1", "anf_106537_01_model2"], "indigo" => [], "dark grey" => ["anf_94747_01_pro

我有一个杂烩:

{
  "grey" => ["anf_94748_01_prod1", "anf_94748_01_model1", "anf_94748_01_model2"],
  "heather blue" => ["anf_106537_01_prod1", "anf_106537_01_model1", "anf_106537_01_model2"],
  "indigo" => [],
  "dark grey" => ["anf_94747_01_prod1"]
}
如何根据图像ID数组替换其值:

[317, 318, 319, 320, 340, 358, 365]
如果哈希数组为空,则跳过它并转到下一个哈希键,并为该图像分配id。所需输出为:

{
  "grey" => [317, 318, 319],
  "heather blue" => [320, 340, 358],
  "indigo" => [],
  "dark grey" => [365]
}

reduce
是一个很好的函数,用于在数据结构中进行移动,同时积累一些结果

imgs = [317, 318, 319, 320, 340, 358, 365]
input = {"grey"=>["anf_94748_01_prod1", "anf_94748_01_model1", "anf_94748_01_model2"], "heather blue"=>["anf_106537_01_prod1", "anf_106537_01_model1", "anf_106537_01_model2"], "indigo"=>[], "dark grey"=>["anf_94747_01_prod1"]}

input.reduce({}) { |acc, (k, xs)| acc[k] = imgs.shift(xs.count); acc}

# => {"grey"=>[317, 318, 319], "heather blue"=>[320, 340, 358], "indigo"=>[], "dark grey"=>[365]} 

reduce
是一个很好的函数,用于在数据结构中进行移动,同时积累一些结果

imgs = [317, 318, 319, 320, 340, 358, 365]
input = {"grey"=>["anf_94748_01_prod1", "anf_94748_01_model1", "anf_94748_01_model2"], "heather blue"=>["anf_106537_01_prod1", "anf_106537_01_model1", "anf_106537_01_model2"], "indigo"=>[], "dark grey"=>["anf_94747_01_prod1"]}

input.reduce({}) { |acc, (k, xs)| acc[k] = imgs.shift(xs.count); acc}

# => {"grey"=>[317, 318, 319], "heather blue"=>[320, 340, 358], "indigo"=>[], "dark grey"=>[365]} 

作为@sawa答案的一种变体,如果您不希望对OP的示例哈希进行变异,您可以这样做:

a = [317, 318, 319, 320, 340, 358, 365]

h.merge(h) { |_,v| a.shift(v.size) }
   #=> {"grey"=>[317, 318, 319], "heather blue"=>[320, 340, 358],
   #    "indigo"=>[], "dark grey"=>[365]

它使用的形式是使用一个块来确定两个散列中存在的键的值,这里是所有键。

作为@sawa答案的变体,如果您不希望对OP的示例散列进行变异,您可以这样做:

a = [317, 318, 319, 320, 340, 358, 365]

h.merge(h) { |_,v| a.shift(v.size) }
   #=> {"grey"=>[317, 318, 319], "heather blue"=>[320, 340, 358],
   #    "indigo"=>[], "dark grey"=>[365]

它使用的形式是使用一个块来确定两个散列中存在的键的值,这里是所有键。

或者更好,因为它与
可枚举#reduce
完全符合您的描述。或者更好,因为它与
可枚举#reduce
完全符合您的描述。很好。或者,
v.replace(a.shift(v.size))
。很好。或者,
v.replace(a.shift(v.size))
.Igor,我有两个建议:1)格式化代码,以便读者无需水平滚动即可阅读;2)将每个示例输入(这里只有一个散列)分配给一个变量,以便读者可以在注释和答案中引用这些变量,而无需定义它们。例如,
h={“grey”=>…}
.Igor,我有两个建议:1)格式化您的代码,以便读者无需水平滚动即可阅读;2)将每个示例输入(这里只有一个散列)分配给一个变量,以便读者可以在注释和答案中引用这些变量,而无需定义它们。例如,
h={“grey”=>…}