使用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'); };