[英]Using Javascript with Underscore.js to Sort the other way
我正在使用Javascript sort
(使用Underscore.js):
_.sortBy(["Bob", "Mary", "Alice"], function (name) {return name})
> ["Alice", "Bob", "Mary"]
我希望數組以其他方式返回。 我怎么做?
[“瑪麗”,“鮑勃”,“愛麗絲”]
我不希望在它排序后將其反轉 - 我希望它是第一次以另一種方式創建。
謝謝。
我寧願將它與Array.reverse
一起使用,而不是將下划線扔掉。
_.sortBy(["Bob", "Mary", "Alice"], function (name) {return name})
.reverse()
我會做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(...)
顯然你不應該這樣做,因為它更有意義的排序,然后反轉結果,但如果你真的想在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()
.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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.