2015-03-05 2 views
4

Предположим, что у меня есть массив хэшейУдалить пара ключ/значение из массива хэшей

a = [ 
    {'id'=>'1','imageUrl'=>'abc','name'=>'x','age'=>'20'},    
    {'id'=>'2','imageUrl'=>'efg','name'=>'y','age'=>'30'}, 
    {'id'=>'3','imageUrl'=>'hij','name'=>'z','age'=>'40'} 
] 

Что может быть самый быстрый способ, чтобы удалить «имя» ключ и «возраст» и их соответствующее значение из всех хэшей в массиве?

Как я могу удалить несколько пар ключ/значение?

ответ

7

Попробуйте следующий код:

a = [ 
    {'id'=>'1','imageUrl'=>'abc','name'=>'x'},    
    {'id'=>'2','imageUrl'=>'efg','name'=>'y'}, 
    {'id'=>'3','imageUrl'=>'hij','name'=>'z'} 
] 

a.each { |h| h.delete("name") } 

p a # => [{"id"=>"1", "imageUrl"=>"abc"}, {"id"=>"2", "imageUrl"=>"efg"}, {"id"=>"3", "imageUrl"=>"hij"}] 
+1

'=> [nil, nil, nil]' –

+2

Не уверен, что вы подразумеваете под этим, но после запуска кода хеши больше не содержат ключей 'name':' pa'' # => [{ "id" => "1", "imageUrl" => "abc"}, {"id" => "2", "imageUrl" => "efg"}, {"id" => "3", " imageUrl "=>" hij "}]' –

+1

Извините, должно быть '=> [" x "," y "," z "]' потому что 'Hash # delete' [return deleted value] (http: // apidock. ком/рубин/Hash/удалить). –

2

Для примера использования except! (или except) метод:

a.map {|o| o.except!('name') } 
+3

Обратите внимание, что 'Hash # except!' - это метод Rails. – pdobb

2

итерацию массива и удалить его из каждого хэша:

a = [ 
    {'id'=>'1','imageUrl'=>'abc','name'=>'x'},    
    {'id'=>'2','imageUrl'=>'efg','name'=>'y'}, 
    {'id'=>'3','imageUrl'=>'hij','name'=>'z'} 
] 
=> [{"id"=>"1", "imageUrl"=>"abc", "name"=>"x"}, {"id"=>"2", "imageUrl"=>"efg", "name"=>"y"}, {"id"=>"3", "imageUrl"=>"hij", "name"=>"z"}] 

a.each do |h| 
    h.delete("name") 
end 

=> [{"id"=>"1", "imageUrl"=>"abc"}, {"id"=>"2", "imageUrl"=>"efg"}, {"id"=>"3", "imageUrl"=>"hij"}] 
6

Ничего подобного бенчмаркинга:

Собранный из приведенных выше ответов: и с помощью benchmark-ips

require 'benchmark/ips' 

def a 
    [ 
    {'id'=>'1','imageUrl'=>'abc','name'=>'x'},    
    {'id'=>'2','imageUrl'=>'efg','name'=>'y'}, 
    {'id'=>'3','imageUrl'=>'hij','name'=>'z'} 
    ] 
end 


Benchmark.ips do |x| 
    x.report("map w/ except!") do |times| 
    a.map {|o| o.except!('name') } 
    end 

    x.report("each w/ except!") do |times| 
    a.each {|o| o.except!('name') } 
    end 



    x.report("map w/ except") do |times| 
    a.map {|o| o.except('name') } 
    end 

    x.report("each w/ except") do |times| 
    a.each {|o| o.except('name') } 
    end 



    x.report("map w/ delete") do |times| 
    a.map { |h| h.delete("name") } 
    end 

    x.report("each w/ delete") do |times| 
    a.each { |h| h.delete("name") } 
    end 


    x.compare! 
end 

я получил следующее:

Calculating ------------------------------------- 
     map w/ except!  8.438k i/100ms 
    each w/ except!  8.439k i/100ms 
     map w/ except  5.242k i/100ms 
     each w/ except  5.469k i/100ms 
     map w/ delete  9.840k i/100ms 
     each w/ delete  9.810k i/100ms 
------------------------------------------------- 
     map w/ except!  1.311B (±25.3%) i/s -  2.994B 
    each w/ except!  1.360B (±25.2%) i/s -  3.048B 
     map w/ except 423.818M (±25.8%) i/s -  1.238B 
     each w/ except 458.859M (±25.7%) i/s -  1.315B 
     map w/ delete  1.955B (±24.0%) i/s -  3.982B 
     each w/ delete  2.025B (±23.5%) i/s -  4.033B 

Comparison: 
     each w/ delete: 2024710811.4 i/s 
     map w/ delete: 1955349074.3 i/s - 1.04x slower 
    each w/ except!: 1360241861.3 i/s - 1.49x slower 
     map w/ except!: 1311373772.5 i/s - 1.54x slower 
     each w/ except: 458859254.7 i/s - 4.41x slower 
     map w/ except: 423818242.2 i/s - 4.78x slower 

a.each { |h| h.delete("name") } Используя самый быстрый (как указано в комментарии).

+1

Ваш последний тест с 'delete', оба являются' map'. Является ли это ошибкой для копирования или является фактическим тестом?Это может изменить ваше заключение! – vee

+1

Я снова запускаю бенчмаркинг с правильными значениями ... обновление скоро появится – Fer

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