Стойностите в хеша са или вмъкнато хеш:
test_multiple_hash = { test: { another_test: 123 } }
или масив от хешове:
test_multiple_hash = { test: [{ another_test: 123 }, { another_test: 124 }] }
След като извлече стойност, трябва да използвам #select за намиране на конкретни вложени хешове:
test_multiple_hash[:test].select { |s| s[:another_test] == 123 }
Ако хешът ми има само един хеш, тогава select
не отговаря на нуждите ми, освен ако не конвертирам единствения хеш в масив.
Има ли по-добър начин да се намери обект от стойността на ключ, когато стойността на ключ в хеш е един хеш или масив от хешове?
Отговори:
1 за отговор № 1Можеш да направиш
[my_hash[:test]].flatten.select { |s| s[:another_test] == 123 }
2 за отговор № 2
Предлагам ви да започнете да правите всички основни стойности на общ модел:
hash = { test: { another_test: 123 },
test2: { test: [{ another_test: 123 }, { another_test: 124 }] }
}
hash.map { |k, v| [k, [*v]] }.to_h # now all of them are arrays.
И след това направете каквото искате, като приемете, че стойностите определено са масиви, напр. г .:
hash.map do |k, v|
[k, [*v]]
end.to_h[:test].select do |s|
s[:another_test] == 123
end
1 за отговор № 3
Методът Ядрото # Array ще преобразува аргумента си в масив:
2.2.1 :002 > Array(1)
=> [1]
освен ако аргументът вече е масив; след това връща непроменения аргумент:
2.2.1 :003 > Array([1])
=> [1]
Така че можете да използвате функцията Array, за да принудите test_multiple_hash[:test]
да бъде масив:
Array(test_multiple_hash[:test]).select { |s| s[:another_test] == 123 }
Резултатът от #select винаги ще бъде масив, дори ако test_multiple_hash[:test]
не е масив.