/ / Използване на #select или на хеш, или на масив от хеши - масиви, ruby, hash

Използвайки #select или върху хеш или масив от хешове - масиви, рубин, хеш

Стойностите в хеша са или вмъкнато хеш:

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] не е масив.