Использование Javascript с Underscore.js для сортировки другим способом - PullRequest
41 голосов
/ 02 января 2012

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

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

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

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

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

Спасибо.

Ответы [ 4 ]

79 голосов
/ 27 августа 2012

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

_.sortBy(["Bob", "Mary", "Alice"], function (name) {return name})
 .reverse()
34 голосов
/ 02 января 2012

Я бы просто сделал то, что 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(...)
0 голосов
/ 08 марта 2019

Вы можете сделать это с 1 вкладышем в ES6, просто измените > в зависимости от желаемого направления.

.sort() поддерживается начиная с IE6, и вы просто передаете функцию, которая возвращает 1 или-1;

["Bob", "Mary", "Alice].sort((a, b) => a > b ? 1 : -1);
0 голосов
/ 06 апреля 2016

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

_.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, которая имеет небольшую кросс-платформенную проблему в отношении согласованного порядка сортировки ...

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

Документация Underscore .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');
};
...