簡體   English   中英

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

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM