Как я могу отсортировать список значений в загруженном порядке?
Приложение У вас есть список элементов с 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, которые являются
удачи.