2015-08-31 85 views
0

我有以下哈希wbs_items如何从数组中的散列中获取所有值?

wbs_items = {"Architecture"=>"architecture", "Auditing"=>"auditing", "Consulting"=>"consulting", "Delivery"=>"delivery", "Development"=>"development", "Engineering"=>"engineering", "Environment/IT"=>"environment", "Graphic Design"=>"graphic_design", "Management"=>"management", "Requirements"=>"requirements", "Research"=>"research", "Support"=>"support", "System Design"=>"system_design", "Test & Eval"=>"test_and_evaluation", "Writing"=>"writing"} 

及以下阵列disciplines

disciplines = ["architecture", "auditing", "consulting", "development", "engineering", "environment", "graphic_design", "management", "system_design", "test_and_evaluation", "writing"] 

我想只从具有数组值的哈希键和值。我会怎么做?

+0

你的例子是不好的(误导)。 'disciplines'中的所有元素都存在'wbs_items'中作为一个值。 – sawa

+0

如果你不在乎效率,你可以这样做:'wbs_items.to_a&wbs_items.keys.product(disciplines)',并根据需要转换为散列。 –

回答

1

什么:

wbs_items.select { |k,v| disciplines.include?(v) } 
+0

完美,谢谢 – Snubber

+2

不,这不完美。虽然这有效,但效率很低。 – sawa

+1

@ sawa的反对意见可以通过编写'require'set'来解决。 dset = disciplines.to_set; wbs_items.select {| _,v | dset.include?(v)}'。 –

1

试试这个:

wbs_items.values & disciplines 
+0

这个工程,但我想获得一个哈希键 - 值对,对不起,没有指定。 – Snubber

0
inverted = wbs_items.invert 
disciplines.to_enum.with_object({}){|k, h| h[inverted[k]] = k} 
+0

是什么让这个解决方案变得更好?它甚至没有工作 – Snubber

+2

@Snubber你是什么意思,它不工作。此解决方案工作正常,比双循环(选定答案)效率更高。我也可以沿着相同的路线提出'disciplines.each_with_object({}){| e,h | h [wbs_items.key(e)] = e if if wbs_items.key?(e)}' – engineersmnky

+0

如果'h = {a:1,b:1}; A = [1]'?我知道结果应该是'h'或'h.to_a'。 –

相关问题