Как я могу отсортировать список значений в загруженном порядке?

Приложение У вас есть список элементов с 1 по n, и вы хотите, чтобы пользователи оценивали их с n по 1. У каждого элемента есть срок выполнения. Элемент 1 имеет ближайший срок оплаты, элемент n - самый поздний срок. Вы хотите, чтобы пользователи оценивали / сортировали элементы в желаемом порядке ранжирования до истечения срока их действия. Вы не хотите, чтобы пользователи могли ранжировать / сортировать элемент по истечении срока, но вы все равно хотите отображать все элементы с их отсортированным рейтингом.

Чтобы отделить элементы, подлежащие оплате, от элементов, подлежащих оплате, вы загружаете их в две отдельные таблицы.

-Таблица должностей: верхняя таблица содержит только те предметы, которые пользователи могут сортировать по рангу. Порядок загружается в порядке убывания. (порядок ранга - это видимое число в примерах jsFiddle ниже)

- Таблица просроченных товаров: нижняя таблица содержит просроченные товары, которые пользователи больше не могут сортировать. Как только элемент (ы) просрочен и в эту таблицу он сохраняет ранг, который был ранее сохранен. Порядок находится в порядке поступления товара, так же, как в порядке возрастания заказа.

Пример Предположим, у вас есть список из десяти элементов, которые вы хотите, чтобы пользователи оценивали. Перед тем, как какие-либо предметы просрочены, у вас будет отображаться только таблица сроков исполнения: http://jsfiddle.net/jpl1618/DdShg/ Там у вас есть пункты, перечисленные 1-10 и дата исполнения по возрастанию (дата исполнения не показана), Число, отображаемое на экране, является рангом в порядке убывания.

Ранг в таблице должностей всегда в порядке убывания, чтобы пользователи могли перемещаться вверх по элементу с большей уверенностью или с меньшей уверенностью. Количество рангов всегда будет соответствовать количеству предметов, но они начинаются со своих противоположностей. Например, пункт 1 начнется с позиции 10 ранга (вверху) и элемента 10 в позиции 1 ранга (внизу).

После того, как предметы просрочены, нижняя таблица будет отображать и содержать просроченные предметы. Допустим, пользователь отсортировал элементы, сохранил их, и половина из них просрочена. Вы можете иметь таблицы, отображаемые следующим образом: http://jsfiddle.net/jpl1618/Y4tjJ/ Обратите внимание, что нижняя таблица содержит пункты с 1 по 5 в этом порядке. Это связано с тем, что нижняя таблица упорядочивает их по возрастанию, что совпадает с возрастанием срока оплаты. Также обратите внимание, что пользователь отсортировал позиции 4 и 5 в ранг 10 и 6. Эти позиции ранга больше не могут использоваться при повторном ранжировании таблицы должностей.

Примеры с просроченнымипредметами Здесь jsfiddle.net/jpl1618/Y4tjJ/ Я должен быть в состоянии переместить элемент 8 (в позиции 5) вверх один на позицию 7, что переместит элемент 10 (в позиции 7) вниз в позицию 5. Так что вы бы иметь результат:

item 9 => rank 9
item 6 => rank 8
item 8 => rank 7
item 10 => rank 5
item 7 => rank 4

Или я должен быть в состоянии переместить пункт 8 до самого верха в позиции 9, что переместит пункты 9,6,10 на одно место. Тогда у вас будет:

item 8 => rank 9
item 9 => rank 8
item 6 => rank 7
item 10 => rank 5
item 7 => rank 4

Обратите внимание, что порядок ранга остается в том же порядке убывания независимо от порядка элементов.

Вопрос Как можно изменить текущий код JS, чтобы позволить пользователю ранжировать / сортировать элементы в таблице должностей, которая содержит загруженные позиции в порядке убывания? В примерах порядок ранжирования всегда должен отображать 9,8,7,5,4, но предметы можно перемещать в эти позиции.

count = 5
countL = 5

L stands for locked

Еще одна небольшая проблема: почему строки таблицы меняют цвета при нажатии вниз для сортировки? Как сделать так, чтобы строка не вспыхнула другим цветом при нажатии на строку?

1 ответ

Я думаю, что, учитывая, что n - небольшое число, мы можем предположить, что решение O(n^2) в порядке.

Таким образом, вы можете построить карту индекса, используя функцию карты:

var myIndexMap = actualyUserdSortedArray.map( function (x) { 
                           return originalArray.indexOf(x); 
                 } );

Затем, когда вы построили эту индексную карту, вы можете получить доступ к вашему массиву originalArray в определенном пользователем порядке, используя эту карту:

 var ithItem =  originalArray[myIndexMap[i]];

основываясь на этой идее, я изменил вашу скрипку, как вы можете видеть здесь: http://jsfiddle.net/Y4tjJ/3/ Я добавил первую строку, чтобы показать текущий массив отображения, который перестраивается при каждом изменении заказа.

Изменить: учитывая относительную сложность поведения, которое вы ищете, я бы предпочел более ориентированный на код способ сделать это. Вам необходимо обработать 4 информации для каждого элемента: id (1-n), isLocked(true/false), dueDate(Date), userOrder(1-c, где c - это число без блокировки). Тогда верхним списком является AllItems.filter(function(x) { return x.isLocked }) .sort(function(a,b) { return (a.userOrder - b.userOrder) }); Нижний список - AllItems.filter(function(x) { return! X.isLocked });

Потому что скоро все станет сложнее: после загрузки списка из какого-либо постоянного хранилища (localStorage или файла сервера), это может быть проще, если JSON состоит из простых js-объектов.
Тогда у вас будет 3 события для обработки. 1) Время от времени вы должны проверять, не заблокированы ли они. если один истек, увеличьте на один все userOrder, которые являются 2) Должен быть какой-то способ "использовать" элемент до его истечения, в противном случае пользователь не будет заинтересован в сортировке элементов. Если элемент используется сейчас, его следует установить как заблокированный. Такое же обновление для userOrder, как в 1). 3) затем вы должны обработать отсортированное измененное событие, чтобы обновить usedOrder для разблокированных элементов.

удачи.

Другие вопросы по тегам