А как вы собираетесь по этим ключам восстанавливать предыдущую сортировку? Вам тогда придется создавать прямо в элементах свойства типа "array_of_previous_next" и т.д., все равно где-то придется хранить информацию о сортировке. Поэтому логичней все-таки отделить сортировку от логики объекта, максимум - задавать объектам либо уникальное имя, либо ID, как-то так:
var array_of_orders = [],
current_order = 0,
objects = [
{ name: 'q_1' },
{ name: 'w_2' },
{ name: 'e_3' },
{ name: 'r_4' },
{ name: 't_5' },
{ name: 'y_6' },
{ name: 'u_7' }
];
array_of_orders.push( objects.map(function(object) { return object.name; }) );
function sort(sort_function) {
objects.sort(sort_function || function() { return Math.random() - 0.5; });
array_of_orders.push( objects.map(function(object) { return object.name; }) );
current_order = array_of_orders.length - 1;
}
function applyOrder(index) {
var order = array_of_orders[index],
result, name_to_find, i, k, l;
if ( order ) {
l = order.length;
result = Array( l );
for (i = 0; i < l; i++) {
name_to_find = order[i];
for (k = 0; k < l; k++) {
if (objects[k].name === name_to_find) {
result[i] = objects[k];
}
}
}
objects = result;
current_order = index;
}
};
Все просто: из важных для сортировки свойств
object имеет только свойство
name, порядок сортировки (массив со значениями свойств
name соответствующего объекта) складывается в массив
array_of_orders, номер текущего порядка сортировки лежит в переменной
current_order. Чтобы отсортировать массив, вызываете функцию
sort() с аргументов в виде функции сортировки, ну или без функции, тогда сортировка будет произвольная. Чтобы вернуть предыдущую сортировку, делаете вызов функции
applyOrder( current_order - 1 ).