2014-09-04 4 views
0

У меня есть этот Hash:Изменить Hash ключи массива в строки

{["word"]=>1, ["cat"]=>2, ["tree"]=>1, ["dog"]=>1} 

Но я хочу, чтобы это Hash:

{"word"=>1, "cat"=>2, "tree"=>1, "dog"=>1} 

Я сделал несколько попыток с each_key и join, но ничего, кажется, работает ,

Как это сделать?

+0

Построить новый хэш с правильными ключами. –

+0

Это звучит как проблема [XY] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem). Может быть, вы должны понять, почему ваши ключи создаются как массивы? Скорее всего, вы делаете что-то не так, когда создается хэш, и теперь вы пытаетесь очистить. –

+0

Я получаю дубликаты из строки: фраза = «собака и собака» – tbrooke

ответ

5

Еще один:

hash = {["word"]=>1, ["cat"]=>2, ["tree"]=>1, ["dog"]=>1} 

hash.map { |(k), v| [k, v] }.to_h 
#=> {"word"=>1, "cat"=>2, "tree"=>1, "dog"=>1} 
+0

+1 Это потрясающе. Любая документация для синтаксиса '| (.) |'? – BroiSatse

+1

@BroiSatse - это разложение массива Ruby (http://www.ruby-doc.org/core-2.1.2/doc/syntax/methods_rdoc.html#label-Array+Decomposition). – Stefan

+0

Nice one .... ... –

1

Это трюк.

h = {["word"]=>1, ["cat"]=>2, ["tree"]=>1, ["dog"]=>1} 
h.keys.each { |k| h[k.first] = h.delete(k) } 

ч теперь { "слово" => 1, "кошка" => 2, "дерево" => 1, "собака" => 1}

+1

Ницца, +1, но обратите внимание, что в блоке вы можете написать прямо '{| k | h [k [0]] = h.delete k} ', так как' Hash # delete' возвращает значение удаляемого ключа. –

+0

@BorisStitnicky Я сделаю это обновление! Я забыл об этом. –

0

такого рода ситуаций возникает так часто с хэшами Ruby, я написал методы для их решения в моем драгоценном камне y_support. Во-первых, введите в командной строке gem install y_support, а затем:

require 'y_support/core_ext/hash' 

h = { ["word"]=>1, ["cat"]=>2, ["tree"]=>1, ["dog"]=>1 } 
h.with_keys &:first 
#=> {"word"=>1, "cat"=>2, "tree"=>1, "dog"=>1} 

Другой способ написания такой же будет

h.with_keys do |key| key[0] end 

Другие полезные методы, определенные в y_support жемчужину являются Hash#with_values, Hash#with_keys!, Hash#with_values! (вклю- версии модификации места) и Hash#modify, который «сопоставляет хэш хэш» таким же образом, как и Array#map, сопоставляет массив массиву.

Смежные вопросы