Я предположил:
- первый элемент каждого элемента
x
не обязательно уникален;
- все элементы
x
, первый элемент которых одинаков, а первый элемент является членом order_array
, последовательно появляются в возвращенном (отсортированном) массиве в том порядке, в котором эти элементы отображаются в x
;
- любые элементы
x
, первый элемент которых не является членом order_array
, появляются в возвращенном (отсортированном) массиве после всех элементов, первый элемент которых находится в sorted_array
, и все такие элементы появляются в возвращенном массиве ( в конце) в порядке, в котором они встречаются в x
; и
- эффективность имеет первостепенное значение.
x = [
["ready", 5], ["shipped", 1], ["pending", 1], ["refunded", 1], ["originated", 3],
["delivered", 23], ["scheduled", 1], ["ready", 8], ["canceled", 51]
]
order_array = [
"ready", "in_progress", "received", "shipped", "scheduled", "pick_up",
"delivered", "canceled", "failed", "refunded", "refund_failed"
]
order_pos = order_array.each_with_object({}) { |word,h| h[word] = [] }
#=> {"ready"=>[], "in_progress"=>[], "received"=>[], "shipped"=>[],
# "scheduled"=>[], "pick_up"=>[], "delivered"=>[], "canceled"=>[],
# "failed"=>[], "refunded"=>[], "refund_failed"=>[]}
back = x.each_with_index.with_object([]) { |((word,v),i),back|
order_pos.key?(word) ? (order_pos[word] << i) : back << [word,v] }
#=> [["pending", 1], ["originated", 3]]
order_pos.flat_map { |word,offsets| offsets.map { |i| x[i] } }.concat(back)
#=> [["ready", 5], ["ready", 8], ["shipped", 1], ["scheduled", 1],
# ["delivered", 23], ["canceled", 51], ["refunded", 1], ["pending", 1],
# ["originated", 3]]
Примечание:
order_pos
#=> {"ready"=>[0, 7], "in_progress"=>[], "received"=>[], "shipped"=>[1],
# "scheduled"=>[6], "pick_up"==>[], "delivered"=>[5], "canceled"=>[8],
# "failed"=>[], "refunded"=>[3], "refund_failed"=>[]}
Необходимо инициализировать order_pos
, чтобы его ключи были заказаны по order_arr
. Это пример значительного изменения, внесенного в Ruby 1.9, который гарантировал, что хеш-ключи останутся в порядке вставки ключей.