लॉश मल्टी-कॉलम सॉर्टिंग अवरोही


151

कई गुणों के आधार पर वस्तुओं की एक सरणी को सॉर्ट करने के लिए एक निफ्टी विधि है:

var data = _.sortBy(array_of_objects, ['type', 'name']);

हालाँकि यह केवल आरोही छँटाई के लिए है। क्या प्रति स्तंभ दिशा को परिभाषित करने का कोई आसान तरीका है? उदाहरण के लिए

var data = _.sortBy(array_of_objects, [{'type': 'asc'}, {'name': 'desc'}]);

जवाबों:


329

३.५.० के रूप में आप सॉर्टबाइडर (बदला हुआ क्रम को v4.3.0 में) का उपयोग कर सकते हैं :

var data = _.sortByOrder(array_of_objects, ['type','name'], [true, false]);

संस्करण 3.10.0 के बाद से आप ऑर्डर करने के लिए मानक शब्दार्थ का भी उपयोग कर सकते हैं (asc, desc):

var data = _.sortByOrder(array_of_objects, ['type','name'], ['asc', 'desc']);

में 4 संस्करण lodash की इस पद्धति का नाम दिया गया है orderBy :

var data = _.orderBy(array_of_objects, ['type','name'], ['asc', 'desc']);

7
आपको जानकारी के लिए, इस फ़ंक्शन का नाम बदलकर _.orderBy ( lodash.com/docs#orderBy ) लॉडश में 4.3.0 कर दिया गया है । सामान्य सॉर्ट फ़ंक्शन को _.sortBy ( lodash.com/docs#sortBy ) कहा जाता है
निधिन डेविड

2
मैं _.sortByOrder is not a functionनवीनतम संस्करण में मिल रहा हूँ ।
चॉवी

66
क्यों लश्कर कार्यों का नाम बदलकर रखता है?
केनी वर्डेन

13
, ['asc', 'desc']हिस्सा सिर्फ lodash@4.17.10 साथ मेरे लिए नजरअंदाज कर दिया हो रही है। सब कुछ बस आरोही है।
मणिनक

4
@maninak यह के लिए है _.sortBy_.orderByइसके बजाय कोशिश करें । उम्मीद है की यह मदद करेगा।
पीसीसेम

45

आप हमेशा उपयोग कर सकते हैं Array.prototype.reverse()

var data = _.sortBy(array_of_objects, ['type', 'name']).reverse();

हा चालाक। एक संख्यात्मक प्रकार आरोही के लिए (लॉश डिफॉल्ट्स उतरते हुए) मैंने इसका इस्तेमाल किया: _.sortBy (array_of_objects, "some_numerical_value_key")। उल्टा ()
devonj

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


14

यह ध्यान देने योग्य है कि यदि आप विशेष गुणों को अवरोही क्रमबद्ध करना चाहते हैं, तो आप अंत में केवल .reverse () को जोड़ना नहीं चाहते हैं, क्योंकि यह सभी प्रकार के अवरोही बना देगा।

विशेष प्रकार के अवरोही बनाने के लिए, अपने प्रकार को कम से कम महत्वपूर्ण से सबसे महत्वपूर्ण, कॉलिंग .reverse () प्रत्येक प्रकार के बाद जो आप अवरोही होना चाहते हैं।

var data = _(data).chain()
    .sort("date")
    .reverse()    // sort by date descending
    .sort("name") // sort by name ascending
    .result()

चूंकि _ का सॉर्ट एक स्थिर सॉर्ट है, आप सुरक्षित रूप से चेन और रिवर्स सॉर्ट कर सकते हैं क्योंकि अगर किसी संपत्ति के लिए दो वस्तुओं का मूल्य समान है, तो उनका ऑर्डर संरक्षित है।

अधिक जानकारी


यदि आपके पास टिप्पणी करने के लिए पर्याप्त प्रतिनिधि नहीं है, तो टिप्पणी न करें। यद्यपि आपने इसे वास्तविक उत्तर में बदल दिया है, जो अच्छा है, लेकिन आपको उस तथ्य का उल्लेख करने की आवश्यकता नहीं है।
आर्टऑफकोड


13

डीप फील्ड और मल्टी फील्ड एंड डिफरेंट डायरेक्शन ऑर्डरिंग लॉडश> 4

var sortedArray = _.orderBy(mixedArray,
                            ['foo','foo.bar','bar.foo.bar'],               
                            ['desc','asc','desc']);

वास्तव में यह अब जवाब होगा। SortBy आपको दिशा नहीं देता है, लेकिन ऑर्डर करता है।
पाब्लो पलासियोस

कृपया एक उत्तर दें? stackoverflow.com/questions/62611489/…
रीगव गार्व

5

क्या प्रति स्तंभ दिशा को परिभाषित करने का कोई आसान तरीका है?

नहीं। आप मूल्य को उलटने वाले कॉलबैक फ़ंक्शन के अलावा अन्य क्रम को निर्दिष्ट नहीं कर सकते। यह भी एक बहुरंगी प्रकार के लिए संभव नहीं है।

आप करने में सक्षम हो सकते हैं

 _.each(array_of_objects, function(o) {
     o.typeDesc = -o.type; // assuming a number
 });
 _.sortBy(array_of_objects, ['typeDesc', 'name'])

बाकी सब के लिए, आपको .sort()एक कस्टम तुलना फ़ंक्शन के साथ मूल का सहारा लेना होगा :

 array_of_objects.sort(function(a, b) {
     return a.type - b.type // asc
         || +(b.name>a.name)||-(a.name>b.name) // desc
         || …;
 });

3

संस्करण 4.11.x के दस्तावेज़ीकरण में, कहते हैं: `" यह विधि _.sortBy की तरह है सिवाय इसके कि यह पुनरावृत्तियों के क्रमबद्ध आदेशों को निर्दिष्ट करने की अनुमति देता है। यदि आदेश अनिर्दिष्ट है, तो सभी मानों को आरोही क्रम में क्रमबद्ध किया जाता है। अन्यथा , "उतर" या "asc" के लिए "desc" का क्रम निर्दिष्ट करें। (स्रोत https://lodash.com/docs/4.17.10#orderBy )

let sorted = _.orderBy(this.items, ['fieldFoo', 'fieldBar'], ['asc', 'desc'])


मुझे लगता है कि आप उपयोग करना _.sortByOrderचाहते थे?
एजे रिचर्डसन

चर नहीं पा सकते हैं _
विशाल वाघासी

कृपया एक उत्तर दें? stackoverflow.com/questions/62611489/…
रीगव गार्व

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.