2012-01-02 12 views
40

I (Underscore.js ile) Javascript sort kullanıyorum sıralama için. Bunu nasıl yaparım?başka bir yol

[ "Mary", "Bob", "Alice"]

o sıralanmış oluyor sonra bunu tersine çevirmek istemiyorum - Ben ilk kez başka bir yol oluşturulmasını istediğiniz .

Teşekkürler.

+1

Nihayetinde diziyi normal olarak sıralamak daha hızlı olabilir ve sonra 'reverse()' yi çağırın! –

+0

Sıralama ve sonra tersine çevirme, diğer seçeneklerden çok daha okunabilir olacaktır. –

cevap

32

Yalnızca, Alt Yazıtın başlık altında yaptığı şeyi yapardım: Array#sort yöntemini kullanın. Bunun yerine uzak underscorejs atma

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

yerine işlevi (isim) {adını döndürür} Az önce alt çizgi en _.identity fonksiyonunu kullanabilirsiniz arasında, aynı zamanda daha büyük –

78

Daha doğrusu iyi yararlanmak için Array.reverse ile birlikte kullanmak istiyorum: Eğer orjinal dizi değişiklik istemiyorsanız

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

Ya da, önce onu klonlamak her ikisi de.

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

için işaretler daha az ters zaman benim için çalıştı: _.sortBy ([ "Bob" "Mary "," Marley "," Alice "], _.identity).ters() – djKianoosh

+4

Bu daha zarif demezdim çünkü. .verse() 'çağrı diziden başka bir döngü ekler. Yani aslında Felix'in önerdiği gibi tersine sıralamaktan daha az verimlidir. – Eschaton

+1

"Hızlı kodu iyi yapmaktan daha iyi bir kod yapmak daha kolay." (Bunu bazı Guru'lara yönlendirin, daha önce kim olduğunu hatırlayamıyorum) Bu daha "zarif", hız gerekli ise, varsayılan sıralama yeterli olabilir; Ancak hız temel konu ise JS, çevrede en hızlı teknolojidir. – Txangel

0

Açıkçası o halde sıralamak sonuçları tersine çevirmek için çok daha mantıklı gibi, bu yapmamalıyız, ama sen gerçekten sıralama işlevi içinde ters sırada sıralamak istiyorsanız, böyle bir şey yapabilirdi. .. o çizgi dikkati çekiyor

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

...

... tutarlı bir sıralama düzeni ile ilgili olarak küçük bir çapraz platform sorunu var sıralama yerli javascript daha kurnazca farklı ise compareFunction (a, b) 0'ı döndürür, a ve b'yi birbirine göre değişmeden bırakır, ancak tüm farklı öğelere göre sıralanır. Not: ECMAscript standardı bu davranışı garanti etmez ve dolayısıyla tüm tarayıcılara (ör. En azından 2003'e dayanan Mozilla sürümleri) bunlara uymaz. Array.prototype.sort()

alt çizgi en .sortBy belgelerine durumları:

bir (kararlı bir şekilde) listenin kopyasını sıralanmış döndürür. yerine sırayla öğeleri tutmak için 0 dönme tarafından yapar _.sortBy

, sol tarafta dizinini eksi sağ tarafında dizinini döndürür.

_.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'); 
}; 
İlgili konular