Ruby 根据第二个数组中的子字符串,将键值对添加到第一个数组中的哈希

Ruby 根据第二个数组中的子字符串,将键值对添加到第一个数组中的哈希,ruby,Ruby,我有一个带散列的数组和另一个带字符串的数组。我想根据第二个数组中的子字符串向第一个数组中的哈希添加一个键值对: 鉴于: export_configs = [ {"foo"=>[{"state"=>"a"}, {"format"=>"aa"}, {"time"=>120}]}, {"bar"=>[{"state"=>"b"}, {"format"=>"bb"}, {"time"=>30}]}, {"baz"=>[{"state"

我有一个带散列的数组和另一个带字符串的数组。我想根据第二个数组中的子字符串向第一个数组中的哈希添加一个键值对:

鉴于:

export_configs = [
  {"foo"=>[{"state"=>"a"}, {"format"=>"aa"}, {"time"=>120}]}, 
  {"bar"=>[{"state"=>"b"}, {"format"=>"bb"}, {"time"=>30}]}, 
  {"baz"=>[{"state"=>"c"}, {"format"=>"cc"}, {"time"=>5}]}
]

topics = [
  "downloads/foo/7s699GToRzf9ViqGU5js/export", "downloads/bar/o679WbgrcNAJepprCWzR/export", "downloads/baz/_s5HQWr1xxq5yB7zPPhQ/export"
]
目标:添加一个新键“url”,其值来自@topics,具体取决于散列键的子字符串,例如“downloads/foo/”或“../bar/…”,如下所示:

结果:

export_configs = [
  {"foo"=>[{"state"=>"a"}, {"format"=>"aa"}, {"time"=>120}, {"url"=>"downloads/foo/7s699GToRzf9ViqGU5js/export"}]}, 
  {"bar"=>[{"state"=>"b"}, {"format"=>"bb"}, {"time"=>30}, {"url"=>"downloads/bar/o679WbgrcNAJepprCWzR/export"}]}, 
  {"baz"=>[{"state"=>"c"}, {"format"=>"cc"}, {"time"=>5}, {"url"=>"downloads/baz/_s5HQWr1xxq5yB7zPPhQ/export"}]}
]
我的尝试:

export_configs.map do |topic|
  topics.each do |t| 
    t.include? topic.first.keys[0]
    topic.merge("url" => t) 
  end
end
但我得到了一个错误:

NoMethodError: undefined method `keys' for #<Array:0x0000000001cbe8b8>```
NoMethodError:#```
但是我得到了错误

这是因为您使用的是
topic.first.keys
,而不是
topic.keys.first
;区别在于
topic.first
的行为类似于
topic.to#a.first
,而
Hash#to#a
返回一个键/值对数组,例如
[[k1,v1],[k2,v2],…]

下面的解决方案正好相反;它迭代
export\u configs
,然后尝试查找相应的主题。在您的示例中,每个
export\u config
hash包含一个键/值对,但我看不出不能有更多键/值对的原因,因此此代码在其中执行另一个循环

它还利用
Enumerable#find
从匹配某个谓词的数组中获取一个对象;这对你的问题特别有用,尽管它不是最快的

export_configs.map do|config|
#防御:配置中可能有更多的键
config.map do |键,值|
#此操作每次扫描主题,速度不是很快
topic=topics.find{| url | url.include?key}
#在这里复制,这样原始变量就不会被修改
values=values+[{'url'=>topic}]如果是topic
[关键、价值]
完
结束
但是我得到了错误

这是因为您使用的是
topic.first.keys
,而不是
topic.keys.first
;区别在于
topic.first
的行为类似于
topic.to#a.first
,而
Hash#to#a
返回一个键/值对数组,例如
[[k1,v1],[k2,v2],…]

下面的解决方案正好相反;它迭代
export\u configs
,然后尝试查找相应的主题。在您的示例中,每个
export\u config
hash包含一个键/值对,但我看不出不能有更多键/值对的原因,因此此代码在其中执行另一个循环

它还利用
Enumerable#find
从匹配某个谓词的数组中获取一个对象;这对你的问题特别有用,尽管它不是最快的

export_configs.map do|config|
#防御:配置中可能有更多的键
config.map do |键,值|
#此操作每次扫描主题,速度不是很快
topic=topics.find{| url | url.include?key}
#在这里复制,这样原始变量就不会被修改
values=values+[{'url'=>topic}]如果是topic
[关键、价值]
完
结束

您收到一个错误,因为
主题。首先是一个数组。这是因为您正在调用Hash(它返回一个数组,即使没有记录,我也能看到)。请查看:

export_configs.each do |topic|
  topics.each do |t|
    p topic 
    p topic.first
    p topic.keys.first # <-- this is the guy, see next
  end
end

其他选项

我会将url映射到一个散列,以确保url中的其他位置没有“foo”、“bar”、“baz”(更改
export\u配置
内容):

然后循环遍历新的哈希:

topics_h.each do |k, v|
  export_configs.each do |h|
    h[k] << {'url' => v} if h.key? k
  end
end

#=> [{"foo"=>[{"state"=>"a"}, {"format"=>"aa"}, {"time"=>120},{"url"=>"downloads/foo/7s699GToRzf9ViqGU5js/export"}]},
#=>  {"bar"=>[{"state"=>"b"}, {"format"=>"bb"}, {"time"=>30}, {"url"=>"downloads/bar/o679WbgrcNAJepprCWzR/export"}]},
#=>  {"baz"=>[{"state"=>"c"}, {"format"=>"cc"}, {"time"=>5},  {"url"=>"downloads/baz/_s5HQWr1xxq5yB7zPPhQ/export"}]}]
topics_h.每个do|k,v|
导出每个do的配置|
h[k]v}如果h.key?K
结束
结束
#=>[{“foo”=>[{“state”=>“a”},{“format”=>“aa”},{“time”=>120},{“url”=>“downloads/foo/7s699GToRzf9ViqGU5js/export”},
#=>{“bar”=>[{“state”=>“b”},{“format”=>“bb”},{“time”=>30},{“url”=>“downloads/bar/o679WbgrcNAJepprCWzR/export”},
#=>{“baz”=>[{“state”=>“c”},{“format”=>“cc”},{“time”=>5},{“url”=>“downloads/baz/[u s5HQWr1xxq5yB7zPPhQ/export”}]

您收到一个错误,因为
主题。首先是一个数组。这是因为您正在调用Hash(它返回一个数组,即使没有记录,我也能看到)。请查看:

export_configs.each do |topic|
  topics.each do |t|
    p topic 
    p topic.first
    p topic.keys.first # <-- this is the guy, see next
  end
end

其他选项

我会将url映射到一个散列,以确保url中的其他位置没有“foo”、“bar”、“baz”(更改
export\u配置
内容):

然后循环遍历新的哈希:

topics_h.each do |k, v|
  export_configs.each do |h|
    h[k] << {'url' => v} if h.key? k
  end
end

#=> [{"foo"=>[{"state"=>"a"}, {"format"=>"aa"}, {"time"=>120},{"url"=>"downloads/foo/7s699GToRzf9ViqGU5js/export"}]},
#=>  {"bar"=>[{"state"=>"b"}, {"format"=>"bb"}, {"time"=>30}, {"url"=>"downloads/bar/o679WbgrcNAJepprCWzR/export"}]},
#=>  {"baz"=>[{"state"=>"c"}, {"format"=>"cc"}, {"time"=>5},  {"url"=>"downloads/baz/_s5HQWr1xxq5yB7zPPhQ/export"}]}]
topics_h.每个do|k,v|
导出每个do的配置|
h[k]v}如果h.key?K
结束
结束
#=>[{“foo”=>[{“state”=>“a”},{“format”=>“aa”},{“time”=>120},{“url”=>“downloads/foo/7s699GToRzf9ViqGU5js/export”},
#=>{“bar”=>[{“state”=>“b”},{“format”=>“bb”},{“time”=>30},{“url”=>“downloads/bar/o679WbgrcNAJepprCWzR/export”},
#=>{“baz”=>[{“state”=>“c”},{“format”=>“cc”},{“time”=>5},{“url”=>“downloads/baz/[u s5HQWr1xxq5yB7zPPhQ/export”}]

是否要修改
export\u-configs
数组?是否要修改
export\u-configs
数组?
Enumerable#首先
返回一个数组,因为它调用
Hash#到_-a
,返回一个键/值对数组。
Enumerable#first
返回一个数组,因为它调用
Hash#a
,后者返回一个键/值对数组。
topics_h.each do |k, v|
  export_configs.each do |h|
    h[k] << {'url' => v} if h.key? k
  end
end

#=> [{"foo"=>[{"state"=>"a"}, {"format"=>"aa"}, {"time"=>120},{"url"=>"downloads/foo/7s699GToRzf9ViqGU5js/export"}]},
#=>  {"bar"=>[{"state"=>"b"}, {"format"=>"bb"}, {"time"=>30}, {"url"=>"downloads/bar/o679WbgrcNAJepprCWzR/export"}]},
#=>  {"baz"=>[{"state"=>"c"}, {"format"=>"cc"}, {"time"=>5},  {"url"=>"downloads/baz/_s5HQWr1xxq5yB7zPPhQ/export"}]}]