Подтвердить что ты не робот

Использование Javascript с Underscore.js для сортировки в другую сторону

Я использую Javascript sort (с Underscore.js):

_.sortBy(["Bob", "Mary", "Alice"], function (name) {return name})
> ["Alice", "Bob", "Mary"]

Я хотел бы, чтобы массив возвращался в другую сторону. Как это сделать?

[ "Мэри", "Боб", "Алиса" ]

Я не хочу менять его после сортировки - я хочу, чтобы он был создан другим способом в первый раз.

Спасибо.

4b9b3361

Ответ 1

Я бы просто сделал то, что делает Underscore под капотом: используйте метод Array # sort.

["Bob", "Mary", "Alice"].sort(function (a, b) {
    if (a < b) return 1;
    if (b < a) return -1;
    return 0;
});

Или, если вы не хотите, чтобы исходный массив был изменен, сначала выполните клонирование:

_.clone(["Bob", "Mary", "Alice"]).sort(...)

Ответ 2

Вместо того, чтобы выбрасывать снизу, я предпочел бы использовать его вместе с Array.reverse, чтобы использовать лучшее из обоих.

_.sortBy(["Bob", "Mary", "Alice"], function (name) {return name})
 .reverse()

Ответ 3

Очевидно, что вы не должны этого делать, поскольку имеет смысл больше сортировать, а затем отменить результаты, но если вы действительно хотите сортировать в обратном порядке внутри функции сортировки, вы можете сделать что-то вроде этого...

_.sortBy(["Bob", "Mary", "Alice"], function (a) {
    // split each string into single characters
    // ... then swap for inverse character from unicode range
    // ... and glue the characters back together into an inversely sortable string
    return _.map(a.split(''), function(i){
        return String.fromCharCode(65536 - i.charCodeAt(0));
    }).join('');
});

... также стоит отметить, что подчеркивание тонко отличается от собственной сортировки javascript, которая имеет небольшую проблему с кросс-платформой относительно последовательного порядка сортировки...

Если compareFunction (a, b) возвращает 0, оставьте a и b без изменений относительно друг друга, но отсортированы по всем различным элементам. Примечание. Стандарт ECMAscript не гарантирует такого поведения, и, таким образом, не все браузеры (например, версии Mozilla, датированные как минимум 2003 годом). Array.prototype.sort()

Подтверждение .sortBy документации:

Возвращает (стабильно) отсортированную копию списка. _. sortBy

Что он делает вместо того, чтобы возвращать 0, чтобы сохранить элементы в порядке, он возвращает индекс левой стороны минус индекс правой стороны.

_.sortBy = function(obj, iteratee, context) {
  iteratee = cb(iteratee, context);
  return _.pluck(_.map(obj, function(value, index, list) {
    return {
      value: value,
      index: index,
      criteria: iteratee(value, index, list)
    };
  }).sort(function(left, right) {
    var a = left.criteria;
    var b = right.criteria;
    if (a !== b) {
      if (a > b || a === void 0) return 1;
      if (a < b || b === void 0) return -1;
    }
    return left.index - right.index;
  }), 'value');
};