2012-01-02 16 views
40

मैं जावास्क्रिप्ट sort उपयोग कर रहा हूँ (Underscore.js के साथ) को क्रमबद्ध करने वाले। मैं उसको कैसे करू?Underscore.js साथ जावास्क्रिप्ट का उपयोग अन्य तरीके से

[ "मैरी" "बॉब", "ऐलिस"]

मैं इसे उल्टा करने के लिए नहीं करना चाहते हैं के बाद यह हल कर रहा है - मैं यह पहली बार दूसरी तरह के आसपास बनाया जा करना चाहते ।

धन्यवाद।

+1

आपको एहसास है कि आखिरकार यह सरणी को सामान्य रूप से सॉर्ट करने के लिए तेज़ी से हो सकता है, और फिर 'रिवर्स() 'कॉल करें? –

+0

छंटनी और फिर उलटना अन्य विकल्पों की तुलना में बहुत अधिक पठनीय होगा। –

उत्तर

32

मैं बस अंडरस्कोर हुड के नीचे क्या करता हूं: Array#sort विधि का उपयोग करें। इसके बजाय underscorejs दूर फेंकने की

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

यह मेरे लिए काम करता है जब मैंने –

78

, मैं नहीं बल्कि यह एक साथ का सबसे अच्छा उपयोग करने के लिए प्रयोग करेंगे Array.reverse साथ:

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

या यदि आप मूल सरणी संशोधित नहीं करना चाहते, यह पहली क्लोन दोनों।

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

से अधिक संकेतों से कम उलट दिया, इसके अलावा, फ़ंक्शन (नाम) {वापसी नाम} के बजाय आप अंडरस्कोर के _.identity फ़ंक्शन का उपयोग कर सकते हैं: _.sortBy (["बॉब", "मैरी "," मार्ले "," एलिस "], _.identity)।रिवर्स() – djKianoosh

+4

मैं इसे और अधिक सुरुचिपूर्ण नहीं कहूंगा क्योंकि '.reverse()' कॉल सरणी के माध्यम से एक और चक्र जोड़ता है। इसलिए फेलिक्स ने सुझाव दिया है कि यह वास्तव में विपरीत में सॉर्ट करने से कम कुशल है। – Eschaton

+1

"तेजी से कोड अच्छा बनाने के लिए अच्छा कोड बनाना आसान है।" (कुछ गुरु को यह श्रेय दें, मुझे याद नहीं है कि इससे पहले किसने कहा था) यह अधिक "सुरुचिपूर्ण" है, यदि गति की आवश्यकता है तो डिफ़ॉल्ट प्रकार पर्याप्त हो सकता है; लेकिन यदि गति मुख्य चिंता है जेएस आसपास की सबसे तेज तकनीक नहीं है। – Txangel

0

जाहिर है आप इस करना चाहिए नहीं, के रूप में यह कहीं अधिक समझ में आता है सॉर्ट करने के लिए, तो परिणाम रिवर्स, लेकिन अगर आप वास्तव में तरह समारोह के अंदर उलटे क्रम में क्रमबद्ध करना चाहते हैं, तो आप इस तरह कुछ कर सकता है। ..

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

... यह भी कहा कि अंडरस्कोर ध्यान देने योग्य प्रकार देशी जावास्क्रिप्ट जो लगातार सॉर्ट क्रम के बारे में एक छोटा सा क्रॉस प्लेटफॉर्म मुद्दा है की तुलना में आसानी से अलग है ...

तो compareFunction (ए, बी) 0 देता है, एक दूसरे को एक दूसरे के संबंध में अपरिवर्तित छोड़ देता है, लेकिन सभी अलग-अलग तत्वों के संबंध में हल किया जाता है। नोट: ईसीएमएस्क्रिप्ट मानक इस व्यवहार की गारंटी नहीं देता है, और इस प्रकार सभी ब्राउज़रों (उदा। कम से कम 2003 तक मोज़िला संस्करण) इस बात का सम्मान नहीं करते हैं। 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'); 
}; 
संबंधित मुद्दे