Как быстро изменить порядок массива Ruby при заказе? У меня есть массив значений и массив, который определяет порядок. Как быстро переупорядочить массив в заданном порядке? data = ['0','1','2','3','4','5'] order = [3,1,2,0,4,5] Я хочу: data = ['3','1','2','0','4','5'] Ответ 1 data = ["0", "1", "2", "3", "4", "5"] order = [3, 1, 2, 0, 4, 5] > order.map{|x| data[x]} => ["3", "1", "2", "0", "4", "5"] Если вы не уверены в правильности индексов, вы можете сделать это: > order.map{|x| data.fetch(x)} # will raise an exception if index out of bounds => ["3", "1", "2", "0", "4", "5"] Ответ 2 Вы можете использовать метод values_at, написанный для такого рода задач: data = ['0','1','2','3','4','5'] order = [3,1,2,0,4,5] data.values_at *order # => ["3", "1", "2", "0", "4", "5"] Ответ 3 Не так хорошо, как @Jakub ответить с помощью Array#values_at (о котором я бы сказал, должен быть принятый ответ), но вот еще одна забава альтернативы: p data.sort_by.with_index{ |d,i| order[i] } p data.zip(order).sort_by(&:last).map(&:first)
Ответ 1 data = ["0", "1", "2", "3", "4", "5"] order = [3, 1, 2, 0, 4, 5] > order.map{|x| data[x]} => ["3", "1", "2", "0", "4", "5"] Если вы не уверены в правильности индексов, вы можете сделать это: > order.map{|x| data.fetch(x)} # will raise an exception if index out of bounds => ["3", "1", "2", "0", "4", "5"]
Ответ 2 Вы можете использовать метод values_at, написанный для такого рода задач: data = ['0','1','2','3','4','5'] order = [3,1,2,0,4,5] data.values_at *order # => ["3", "1", "2", "0", "4", "5"]
Ответ 3 Не так хорошо, как @Jakub ответить с помощью Array#values_at (о котором я бы сказал, должен быть принятый ответ), но вот еще одна забава альтернативы: p data.sort_by.with_index{ |d,i| order[i] } p data.zip(order).sort_by(&:last).map(&:first)