Разное

Underscore js на русском: Underscore.js | русская документация

22.12.2022

javascript — Вывести отсортированный список с помощью метода _.sortBy by underscore.js

Вопрос задан

Изменён 6 лет 2 месяца назад

Просмотрен 356 раз

В проекте использованы backbone + underscore и jade + stylus.

В шаблоне jade имеется переменная, которая выводит не сортированный список

<% _.each(territory_list, function(territory) {%>

Для вывода списка используется метод _.each.

Если я правильно понимаю, чтобы вывести отсортированный список, необходимо использовать метод _.sortBy для выводимого списка territory_list. Но не понимаю где этот метод применить. Представляю что запись должна быть примерно такая (не работает):

<% _. each_.sortBy(territory_list, function(territory) {%>

Как вывести отсортированный список с использованием метода от underscore?

UPD

Уточняю вопрос. В результате сортировки должен вывестись список по возрастающей. Например:

Территория 1
Территория 2
Территория 3
...
Территория 20

и т.д.

  • javascript
  • backbone.js
  • underscore.js

8

Не знаю, откуда взялись ваши представления, но они абсолютно не верны (достаточно мельком просмотреть документацию Underscore.js чтобы в этом убедиться).

Более того, метод _.sortBy нужен не для сортировки массивов строк, а для сортировки коллекций

(массивов однотипных объектов). Для сортировки массива строк намного лучше подходит метод Array.prototype.sort. Но тут есть одна тонкость: этот метод использует лексикографический порядок строк при сортировке. То есть, вы получите:

Foo 1
Foo 10
Foo 2

вместо

Foo 1
Foo 2
Foo 10

Чтобы получить правильный результат, вам нужно использовать натуральную сортировку вместо лексикографической. В общем виде, задача требует отдельного рассмотрения и может потребовать использования сторонних библиотек (например, javascript-natural-sort, но Google расскажет вам и о других, которые могут быть лучше/удобнее).

Если же все действительно так просто, как вы говорите в вопросе (сочетание слова «Территория» и целочисленного ее номера), то вам всего лишь надо передать правильную функцию-компаратор методу Array.prototype.sort:

var territoryComparator = function(a, b) {
    var numRegExp = /(.*?)(\d+)$/;
    return parseInt(a.replace(numRegExp, '$2'))
        - parseInt(b.replace(numRegExp, '$2'))
};

При этом, ваш шаблон должен иметь вид:

<% _.each(territory_list.sort(territoryComparator), function(territory) { %>
    <!-- А здесь вы можете отрисовывать ваши "территории" -->
<% }) %>

0

Зарегистрируйтесь или войдите

Регистрация через Google

Регистрация через Facebook

Регистрация через почту

Отправить без регистрации

Почта

Необходима, но никому не показывается

Отправить без регистрации

Почта

Необходима, но никому не показывается

Нажимая на кнопку «Отправить ответ», вы соглашаетесь с нашими пользовательским соглашением, политикой конфиденциальности и политикой о куки

лучших фрилансеров Underscore.

js в Марокко
  • $25/час · Начинается с 25 долларов

    ФАЙЛ — Вице-президент Камала Харрис встречается с президентом Танзании Самией Сулуху Хасан в церемониальном кабинете Харриса в здании исполнительного офиса Эйзенхауэра в кампусе Белого дома, 15 апреля 202…