Общее примечание по сортировке. Используйте #sort_by
метод array класса ruby «s:
[{'id' => 1},{'id'=>3},{'id'=>2}].sort_by {|x|x['id'] }
# => [{"id"=>1}, {"id"=>2}, {"id"=>3}]
Или с использованием #values
Способ обратного вызова:
[{'id' => 1},{'id'=>3},{'id'=>2}].sort_by(&:values)
# => [{"id"=>1}, {"id"=>2}, {"id"=>3}]
или вы можете использовать более очевидный вариант с #sort
методом:
[{'id' => 1},{'id'=>3},{'id'=>2}].sort {|x,y| x['id'] <=> y['id'] }
# => [{"id"=>1}, {"id"=>2}, {"id"=>3}]
Для вашего случая, для сортировки с расширенным условием используйте #%
, чтобы разделить ev еп и нечетные индексы:
[{'id' => 1},{'id'=>4},{'id'=>9},{'id'=>2},{'id'=>7}].sort do |x,y|
u = y['id'] % 2 <=> x['id'] % 2
u == 0 && y['id'] <=> x['id'] || u
end
# => [{"id"=>1}, {"id"=>7}, {"id"=>9}, {"id"=>2}, {"id"=>4}]
В вашем случае, чтобы разобраться с расширенным условия использования #%
разделить по индексу, даже id
значение отсутствует в массиве индекса:
index = [1,3,5,7,4,2,6,8,10] # swapped 2 and 4, 9 is absent
[{'id' => 1},{'id'=>4},{'id'=>9},{'id'=>2},{'id'=>7}].sort do |x,y|
!index.rindex(x[ 'id' ]) && 1 || index.rindex(x[ 'id' ]) <=> index.rindex(y[ 'id' ]) || -1
end
# => [{"id"=>1}, {"id"=>7}, {"id"=>4}, {"id"=>2}, {"id"=>9}]
@ монах-кода Thanx =) –
Ожидаемый результат является '[{ 'ID' => 1}, { 'ID' => 7}, { 'ID' => 9}, { 'id' => 2}, {'id' => 4}] ' – nish
@ Малъ я люблю чистые решения. –