2013-03-20 5 views
0

У меня есть 2d массив так:картографирование два двумерный массив в одномерный массив с индексами

ary = [ 
    ["Source", "attribute1", "attribute2"], 
    ["db", "usage", "value"], 
    ["import", "usage", "value"], 
    ["webservice", "usage", "value"] 
] 

Я хочу, чтобы вытащить следующий хэш:

{1 => "db", 2 => "import", 3 => "webservice"} // keys are indexes or outer 2d array 

Я знаю, как получить это путем циклического ввода 2-го массива. Но так как я учусь рубин, я думал, что я мог бы сделать это с чем-то вроде этого

ary.each_with_index.map {|element, index| {index => element[0]}}.reduce(:merge) 

Это дает мне:

{0=> "Source", 1 => "db", 2 => "import", 3 => "webservice"} 

Как избавиться от 0 элемента из моего вывода карты?

ответ

1

Я бы написать:

Hash[ary.drop(1).map.with_index(1) { |xs, idx| [idx, xs.first] }] 
#=> {1=>"db", 2=>"import", 3=>"webservice"} 
0

ary.drop(1) Отбрасывает первый элемент, возвращает остальное.

Вы можете построить хэш непосредственно без уменьшения слияния с использованием each_with_object

ary.drop(1) 
    .each_with_object({}) 
    .with_index(1) { |((source,_,_),memo),i| memo[i] = source } 

Или карта для кортежей и отправить в Hash[] конструктор.

Hash[ ary.drop(1).map.with_index(1) { |(s,_,_),i| [i, s] } ] 
Смежные вопросы