使用Javascript与Underscore.jssorting的另一种方式

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

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

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

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

我不想在sorting之后将其反转 – 我希望在第一次时就以相反的方式创build它。

谢谢。

我只想做下面的内容:使用Array#sorting方法。

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

或者,如果您不想修改原始数组,请先将其克隆:

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

而不是抛出下划线,我宁愿与Array.reverse一起使用它,以利用两者中最好的。

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

显然,你不应该这样做,因为它更有意义的sorting,然后扭转结果,但是如果你真的想在sortingfunction内倒序sorting,你可以做这样的事情…

 _.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(''); }); 

…还值得注意的是,下划线与原生JavaScriptsorting有微妙的不同,它具有一致的sorting顺序的小跨平台问题…

如果compareFunction(a,b)返回0,则相对于彼此保持a和b不变,但相对于所有不同的元素进行sorting。 注意:ECMAscript标准并不保证这种行为,因此不是所有的浏览器(例如,至less可以追溯到2003年的Mozilla版本)都尊重这一点。 Array.prototype.sort()

下划线的.sortBy文档指出:

返回列表的(稳定)sorting副本。 _。sorting方式

它通过不是返回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'); };