我正在使用Javascript sort
(使用Underscore.js):
_.sortBy(["Bob", "Mary", "Alice"], function (name) {return name})
> ["Alice", "Bob", "Mary"]
我希望数组以其他方式返回。我怎么做?
[“玛丽”,“鲍勃”,“爱丽丝”]
我不希望在它排序后将其反转 - 我希望它是第一次以另一种方式创建。
谢谢。
我会做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(...)
我宁愿将它与Array.reverse
一起使用,而不是将下划线扔掉。
_.sortBy(["Bob", "Mary", "Alice"], function (name) {return name})
.reverse()
显然你不应该这样做,因为它更有意义的排序,然后反转结果,但如果你真的想在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');
};
您可以在ES6中使用1个衬垫执行此操作,只需根据您想要的方向更改>
。
从IE6开始支持.sort()
,你只需传递一个返回1或-1的函数;
["Bob", "Mary", "Alice].sort((a, b) => a > b ? 1 : -1);