使用Javascript和Underscore.js以另一种方式排序

问题描述 投票:41回答:4

我正在使用Javascript sort(使用Underscore.js):

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

我希望数组以其他方式返回。我怎么做?

[“玛丽”,“鲍勃”,“爱丽丝”]

我不希望在它排序后将其反转 - 我希望它是第一次以另一种方式创建。

谢谢。

javascript sorting underscore.js
4个回答
34
投票

我会做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(...)

79
投票

我宁愿将它与Array.reverse一起使用,而不是将下划线扔掉。

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

0
投票

显然你不应该这样做,因为它更有意义的排序,然后反转结果,但如果你真的想在sort函数内以相反的顺序排序,你可以做这样的事情......

_.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标准不保证这种行为,因此并非所有浏览器(例如可追溯到至少2003年的Mozilla版本)都尊重这一点。 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');
};

0
投票

您可以在ES6中使用1个衬垫执行此操作,只需根据您想要的方向更改>

从IE6开始支持.sort(),你只需传递一个返回1或-1的函数;

["Bob", "Mary", "Alice].sort((a, b) => a > b ? 1 : -1);
© www.soinside.com 2019 - 2024. All rights reserved.