स्ट्रिंग गुण मान द्वारा ऑब्जेक्ट की क्रमबद्ध सरणी


2763

मेरे पास जावास्क्रिप्ट ऑब्जेक्ट्स की एक सरणी है:

var objs = [ 
    { first_nom: 'Lazslo', last_nom: 'Jamf'     },
    { first_nom: 'Pig',    last_nom: 'Bodine'   },
    { first_nom: 'Pirate', last_nom: 'Prentice' }
];

मैं उन्हें last_nomजावास्क्रिप्ट में कैसे मान सकता हूं ?

मुझे पता है sort(a,b), लेकिन यह केवल तार और संख्या पर काम करता है। क्या मुझे toString()अपनी वस्तुओं में एक विधि जोड़ने की आवश्यकता है ?


7
यह स्क्रिप्ट आपको केवल यह करने की अनुमति देती है कि जब तक आप अपनी तुलना फ़ंक्शन या सॉर्टर नहीं लिखना चाहते हैं: thomasfrank.se/sorting_things.html
बावर्सजो

सबसे तेज़ तरीका आइसोमॉर्फिक सॉर्ट-एरे- मॉड्यूल का उपयोग करना है जो किसी भी प्रकार के इनपुट, कंप्यूटेड फ़ील्ड और कस्टम सॉर्ट ऑर्डर का समर्थन करते हुए ब्राउज़र और नोड दोनों में मूल रूप से काम करता है।
लॉयड

जवाबों:


3917

अपने तुलनात्मक फंक्शन को लिखना काफी आसान है:

function compare( a, b ) {
  if ( a.last_nom < b.last_nom ){
    return -1;
  }
  if ( a.last_nom > b.last_nom ){
    return 1;
  }
  return 0;
}

objs.sort( compare );

या इनलाइन (c / o मार्को डेमायो):

objs.sort((a,b) => (a.last_nom > b.last_nom) ? 1 : ((b.last_nom > a.last_nom) ? -1 : 0)); 

441
या इनलाइन: objs.sort (फ़ंक्शन (a, b) {वापसी (a.last_nom> b.last_nom); 1: ((b.last_nom> a.last_nom)? -1: 0);});
मार्को डेमायो


176
return a.last_nom.localeCompare(b.last_nom)काम करेगा, भी।
सेरेब्रस

146
उन लोगों की तलाश में जहां क्षेत्र संख्यात्मक है, फ़ंक्शन बॉडी की तुलना करें: return a.value - b.value;(ASC)
आंद्रे Figueiredo

20
localeCompareविदेशी भाषाओं में उच्चारण पात्रों का उपयोग करते समय @Cerbrus महत्वपूर्ण है, और साथ ही अधिक सुरुचिपूर्ण।
मार्कोस लीमा

839

आप एक डायनामिक सॉर्ट फ़ंक्शन भी बना सकते हैं जो ऑब्जेक्ट को उनके मान से सॉर्ट करता है जिसे आप पास करते हैं:

function dynamicSort(property) {
    var sortOrder = 1;
    if(property[0] === "-") {
        sortOrder = -1;
        property = property.substr(1);
    }
    return function (a,b) {
        /* next line works with strings and numbers, 
         * and you may want to customize it to your needs
         */
        var result = (a[property] < b[property]) ? -1 : (a[property] > b[property]) ? 1 : 0;
        return result * sortOrder;
    }
}

तो आप इस तरह की वस्तुओं की एक सरणी हो सकता है:

var People = [
    {Name: "Name", Surname: "Surname"},
    {Name:"AAA", Surname:"ZZZ"},
    {Name: "Name", Surname: "AAA"}
];

... और जब आप काम करेंगे:

People.sort(dynamicSort("Name"));
People.sort(dynamicSort("Surname"));
People.sort(dynamicSort("-Surname"));

वास्तव में यह पहले से ही सवाल का जवाब देता है। नीचे का हिस्सा लिखा हुआ है क्योंकि कई लोगों ने मुझसे संपर्क किया, शिकायत की कि यह कई मापदंडों के साथ काम नहीं करता है

एकाधिक पैरामीटर

आप कई प्रकार के मापदंडों के साथ प्रकार्य उत्पन्न करने के लिए नीचे दिए गए फ़ंक्शन का उपयोग कर सकते हैं।

function dynamicSortMultiple() {
    /*
     * save the arguments object as it will be overwritten
     * note that arguments object is an array-like object
     * consisting of the names of the properties to sort by
     */
    var props = arguments;
    return function (obj1, obj2) {
        var i = 0, result = 0, numberOfProperties = props.length;
        /* try getting a different result from 0 (equal)
         * as long as we have extra properties to compare
         */
        while(result === 0 && i < numberOfProperties) {
            result = dynamicSort(props[i])(obj1, obj2);
            i++;
        }
        return result;
    }
}

जो आपको कुछ ऐसा करने में सक्षम करेगा:

People.sort(dynamicSortMultiple("Name", "-Surname"));

उपश्रेणी अर्रे

हमारे बीच भाग्यशाली के लिए जो ईएस 6 का उपयोग कर सकता है, जो देशी वस्तुओं को निकालने की अनुमति देता है:

class MyArray extends Array {
    sortBy(...args) {
        return this.sort(dynamicSortMultiple.apply(null, args));
    }
}

यह इसे सक्षम करेगा:

MyArray.from(People).sortBy("Name", "-Surname");

कृपया ध्यान दें कि जावास्क्रिप्ट में संपत्ति के नाम किसी भी स्ट्रिंग हो सकते हैं और यदि आपके पास "-" के साथ शुरू होने वाले गुण हैं (अत्यंत संभावना नहीं है और शायद एक अच्छा विचार नहीं है), तो आपको रिवर्स सॉर्ट के रूप में कुछ और का उपयोग करने के लिए डायनेमिकॉर्ट फ़ंक्शन को संशोधित करना होगा। सूचक।
एग --ज़कैन

मैंने देखा है कि dynamicSort()उपरोक्त उदाहरण में लोअरकेस अक्षरों के आगे बड़े अक्षरों को रखा जाएगा। उदाहरण के लिए, अगर मैं मान हैं APd, Aklinऔर Abe- एक एएससी में परिणाम तरह होना चाहिए Abe, Aklin, APd। लेकिन अपने उदाहरण के साथ, परिणाम हैं APd, Abe, Aklin। वैसे भी इस व्यवहार को ठीक करने के लिए?
लॉयड बैंक

6
@LloydBanks यदि आप स्ट्रिंग्स के लिए इसे सख्ती से उपयोग कर रहे हैं, तो आप var result = a[property].localeCompare(b[property]);इसके बजाय उपयोग कर सकते हैं var result = (a[property] < b[property]) ? -1 : (a[property] > b[property]) ? 1 : 0;
एग Augzcan

1
@ Ege thezcan यह या तो आइटम को ऊपर या नीचे रखना चाहिए, यहाँ पर कार्यान्वयन मैंने pastebin.com/g4dt23jU
dzh

1
यह बहुत अच्छा समाधान है लेकिन अगर आप संख्याओं की तुलना करते हैं तो एक समस्या है। कृपया जाँच से पहले इसे जोड़ें:if( !isNaN(a[property]) ) a[property] = Number(a[property]); if( !isNaN(b[property]) ) b[property] = Number(b[property]);
इविज़न स्टीफन स्टिपिक

414

ES6 / ES2015 या बाद में आप इस तरह से कर सकते हैं:

objs.sort((a, b) => a.last_nom.localeCompare(b.last_nom));

ES6 / ES2015 से पहले

objs.sort(function(a, b) {
    return a.last_nom.localeCompare(b.last_nom)
});

29
यह JS 1.1 के बाद से उपलब्ध है, इस के लिए वसा तीर टुकड़ा ES6 / 2015 टुकड़ा है। लेकिन अभी भी बहुत उपयोगी है, और मेरी राय में सबसे अच्छा जवाब
जॉन हार्डिंग

13
@PratikKelwalkar: यदि आपको रिवर्स चाहिए तो बस a और b तुलना स्विच करें: objs.sort ((a, b) => b.last_nom.localeCompare (a.last_nom));
व्लाद बेजेन

क्या छँटाई के लिए क्षेत्र को संबोधित करने के लिए एक सूचकांक का उपयोग करना संभव है last_nom: सरणी में केवल संख्या के उपयोग के बजाय 1:?
और

4
@VladBezden आपके उत्तर के लिए धन्यवाद! यह समाधान बहुत छोटे प्रोग्रामेटिक प्रयास और सही सॉर्टिंग परिणामों और स्ट्रिंग स्ट्रिंग के साथ पहला है: जैसे ["Name1", "Name10", "Name2", "कुछ और", "Name11"]। मुझे ठीक से काम करने के लिए छंटनी मिलीobjs.sort((a, b) => a.last_nom.localeCompare(b.last_nom, undefined, {numberic: true}));
scipper

1
अवरोही संख्याओं के साथ ऐसा करने के लिए: .sort (a, b) => b.numberProperty - a.numberProperty)। आरोही: .sort ((a, b) => a.numberProperty - b.numberProperty)
सेबेस्टियन पैटन

188

Underscore.js

अंडरस्कोर का उपयोग करें, इसके छोटे और भयानक ...

SortBy_.sortBy (सूची, पुनरावृत्ति, [संदर्भ]) सूची की एक क्रमबद्ध प्रति लौटाता है, पुनरावृत्ति क्रम में क्रमबद्ध होकर प्रत्येक मान को पुनरावृति के माध्यम से चलाता है। Iterator इसके द्वारा सॉर्ट करने के लिए संपत्ति का स्ट्रिंग नाम भी हो सकता है (जैसे। लंबाई)।

var objs = [ 
  { first_nom: 'Lazslo',last_nom: 'Jamf' },
  { first_nom: 'Pig', last_nom: 'Bodine'  },
  { first_nom: 'Pirate', last_nom: 'Prentice' }
];

var sortedObjs = _.sortBy( objs, 'first_nom' );

18
डेविड, तुम, जवाब कहने के लिए संपादित कर सकता है var sortedObjs = _.sortBy( objs, 'first_nom' );objsइसके परिणामस्वरूप खुद को नहीं छाँटा जाएगा। फ़ंक्शन एक सॉर्ट किया गया सरणी लौटाएगा । इससे यह और स्पष्ट हो जाएगा।
जेस

10
सॉर्ट को उलटने के लिए:var reverseSortedObjs = _.sortBy( objs, 'first_nom' ).reverse();
एरडल जी।

2
आपको जावास्क्रिप्ट लिबरी "अंडरस्कोर" को लोड करने की आवश्यकता है:<script src="http://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"> </script>
और - bri

5
Lodashउन लोगों के लिए भी उपलब्ध है जो पसंद करते हैं कि एक
WoJ

2
लॉश में यह समान होगा: var sortedObjs = _.sortBy( objs, 'first_nom' );या यदि आप इसे एक अलग क्रम में चाहते हैं:var sortedObjs = _.orderBy( objs, ['first_nom'],['dsc'] );
ट्रैविस हेटर

186

यह मत समझो कि लोग इसे इतना जटिल क्यों बनाते हैं:

objs.sort(function(a, b){
  return a.last_nom > b.last_nom;
});

सख्त इंजन के लिए:

objs.sort(function(a, b){
  return a.last_nom == b.last_nom ? 0 : +(a.last_nom > b.last_nom) || -1;
});

इसे स्वैप करने के लिए ऑपरेटर को रिवर्स अल्फाबेटिकल ऑर्डर द्वारा स्वैप करें।


17
यह वास्तव में सही नहीं है क्योंकि सॉर्ट में उपयोग किया जाने वाला फ़ंक्शन -1, 0, या 1 वापस करना चाहिए लेकिन उपरोक्त फ़ंक्शन एक बूलियन देता है। सॉर्ट क्रोम में ठीक काम करता है लेकिन उदाहरण के लिए फैंटमज में विफल रहता है। देखें code.google.com/p/phantomjs/issues/detail?id=1090
schup

कुछ इंजन मूर्खता का हिसाब देते हैं, इस तरह से यह शोषण था। मैंने एक उचित संस्करण के साथ अपना उत्तर अपडेट किया है।
p3lim

19
मैं पहले संस्करण को बाहर निकालने के लिए संपादन का सुझाव दूंगा। इसकी अधिक रसीला इसलिए अधिक आकर्षक लगती है, लेकिन यह कम से कम मज़बूती से काम नहीं करती है। यदि कोई इसे एक ब्राउज़र में आज़माता है और यह काम करता है, तो उन्हें एहसास भी नहीं हो सकता है कि उन्हें कोई समस्या है (विशेषकर यदि उन्होंने टिप्पणियों को नहीं पढ़ा है)। दूसरा संस्करण ठीक से काम करता है इसलिए वास्तव में पहले की कोई आवश्यकता नहीं है।
केट

2
@ साइमन मैं वास्तव में पहले "थोड़ा गलत" संस्करण होने की सराहना करता था, क्योंकि सख्त कार्यान्वयन को पार्स करने और समझने में कुछ सेकंड लगते हैं और इसके बिना बहुत कठिन होगा।
आरोन शर्मन

1
@ सिंह if(a.count == b.count) return a.name > b.name; else return a.count > b.count;
p3lim

62

यदि आपके पास अंतिम नामों की नकल है तो आप पहले नाम से छांट सकते हैं-

obj.sort(function(a,b){
  if(a.last_nom< b.last_nom) return -1;
  if(a.last_nom >b.last_nom) return 1;
  if(a.first_nom< b.first_nom) return -1;
  if(a.first_nom >b.first_nom) return 1;
  return 0;
});

@BadFeelingAbout यह -1 या 1 का क्या मतलब है? मैं समझता हूँ कि -1 का शाब्दिक अर्थ है कि A केवल B सिंटैक्स द्वारा B से कम है, लेकिन 1 या -1 का उपयोग क्यों करते हैं? मैं देखता हूं कि हर कोई उन नंबरों का उपयोग रिटर्न वैल्यू के रूप में कर रहा है, लेकिन क्यों? धन्यवाद।
क्रिस

1
@ क्रिस 22 एक नकारात्मक संख्या लौटी है जिसका अर्थ है कि सरणी के bबाद आना चाहिए a। यदि कोई पॉजिटिव नंबर दिया जाता है, तो इसका मतलब aउसके बाद आना चाहिए b। यदि 0लौटाया जाता है, तो इसका मतलब है कि उन्हें समान माना जाता है। आप हमेशा दस्तावेज़ीकरण पढ़ सकते हैं: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
BadFeelingAboutThis

@BadFeelingAbout यह धन्यवाद, स्पष्टीकरण और लिंक के लिए। मानो या न मानो, मैंने 1, 0, -1यहां यह पूछने से पहले कोड के विभिन्न स्निपेट का उपयोग किया । मुझे अभी वह जानकारी नहीं मिल रही थी जिसकी मुझे आवश्यकता थी।
क्रिस

48

प्रोटोटाइप इनहेरिटेंस का उपयोग करके इस समस्या का सरल और त्वरित समाधान:

Array.prototype.sortBy = function(p) {
  return this.slice(0).sort(function(a,b) {
    return (a[p] > b[p]) ? 1 : (a[p] < b[p]) ? -1 : 0;
  });
}

उदाहरण / उपयोग

objs = [{age:44,name:'vinay'},{age:24,name:'deepak'},{age:74,name:'suresh'}];

objs.sortBy('age');
// Returns
// [{"age":24,"name":"deepak"},{"age":44,"name":"vinay"},{"age":74,"name":"suresh"}]

objs.sortBy('name');
// Returns
// [{"age":24,"name":"deepak"},{"age":74,"name":"suresh"},{"age":44,"name":"vinay"}]

अद्यतन: अब मूल सरणी को संशोधित नहीं करता है।


5
यह सिर्फ एक और सरणी वापस नहीं है। लेकिन वास्तव में मूल एक तरह से !.
विनय अग्रवाल

यदि आप यह सुनिश्चित करना चाहते हैं कि आप संख्याओं के साथ एक प्राकृतिक प्रकार का उपयोग कर रहे हैं (यानी, 0,1,2,10,11 आदि ...) मूलांक सेट के साथ parseInt का उपयोग करें। developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… तो: वापसी (parseInt ([p], 10)> parseInt (b [p], 10))? 1: (parseInt (a [p], 10) <parseInt (b [p], 10))? -1: 0;
पॉल

@codehuntr इसे सही करने के लिए धन्यवाद। लेकिन मुझे लगता है कि इस संवेदीकरण को करने के लिए सॉर्ट फ़ंक्शन करने के बजाय, यह बेहतर है कि हम डेटा प्रकारों को ठीक करने के लिए एक अलग फ़ंक्शन करें। क्योंकि सॉर्ट फ़ंक्शन यह नहीं बता सकता है कि किस संपत्ति में किस प्रकार का डेटा होगा। :)
विनय अग्रवाल

बहुत अच्छा। आरोही / डीएससी प्रभाव प्राप्त करने के लिए तीरों को उल्टा करें।
अब्दुल सादिक यल्किन

4
कभी नहीं, कभी एक समाधान का सुझाव दें जो एक मूल वस्तु के प्रोटोटाइप को संशोधित करता है
pbanka

39

2018 तक बहुत कम और सुरुचिपूर्ण समाधान है। महज प्रयोग करें। Array.prototyp.sort ()

उदाहरण:

var items = [
  { name: 'Edward', value: 21 },
  { name: 'Sharpe', value: 37 },
  { name: 'And', value: 45 },
  { name: 'The', value: -12 },
  { name: 'Magnetic', value: 13 },
  { name: 'Zeros', value: 37 }
];

// sort by value
items.sort(function (a, b) {
  return a.value - b.value;
});

7
प्रश्न में स्ट्रिंग्स का उपयोग संख्याओं के विपरीत तुलना के लिए किया गया था। आपका उत्तर संख्याओं के आधार पर छँटाई के लिए बहुत अच्छा काम करता है, लेकिन स्ट्रिंग द्वारा तुलना के लिए इतना अच्छा नहीं है।
smcstewart

a.value - b.valueवस्तु की विशेषताओं (तुलना करने के लिए इस्तेमाल किया संख्या इस मामले में) डेटा के विभिन्न समय के लिए अपनाया जा सकता है। उदाहरण के लिए, रेगेक्स का उपयोग पड़ोसी तारों के प्रत्येक जोड़े की तुलना करने के लिए किया जा सकता है ।
०६

1
@ 0leg मैं इस तरह से तार की तुलना करने के लिए रेगेक्स का उपयोग करने के लिए यहां एक उदाहरण देखना चाहता हूं।
बॉब स्टीन

यदि आप इसे आईडी द्वारा सॉर्ट करना चाहते हैं तो यह कार्यान्वयन काफी अच्छा है। हाँ, आपने पड़ोसी स्ट्रिंग की तुलना करने के लिए रेगेक्स का उपयोग करने का सुझाव दिया है जो समाधान को अधिक जटिल बनाता है जबकि इस सरलीकृत संस्करण का उद्देश्य अन्यथा होगा यदि रेगेक्स का उपयोग दिए गए समाधान के साथ किया जाता है। सादगी सर्वश्रेष्ठ है।
सुरेंद्रपांडय

33

पुराना उत्तर जो सही नहीं है:

arr.sort((a, b) => a.name > b.name)

अपडेट करें

ब्यूचैम्प की टिप्पणी से:

arr.sort((a, b) => a.name < b.name ? -1 : (a.name > b.name ? 1 : 0))

अधिक पठनीय प्रारूप:

arr.sort((a, b) => {
  if (a.name < b.name) return -1
  return a.name > b.name ? 1 : 0
})

नेस्टेड टर्नरीज़ के बिना:

arr.sort((a, b) => a.name < b.name ? - 1 : Number(a.name > b.name))

स्पष्टीकरण: करने के लिए और करने के लिए Number()डाली जाएगी ।true1false0


यह काम करता है, लेकिन परिणाम किसी कारण से अस्थिर है
टाइटनफाइटर

@ AO17 नहीं, यह नहीं होगा। आप तार को घटा नहीं सकते।
पैट्रिक रॉबर्ट्स

15
इसे यह करना चाहिए:arr.sort((a, b) => a.name < b.name ? -1 : (a.name > b.name ? 1 : 0))
जीन-फ्रांस्वा ब्यूशैम्प

3
@ जीन-फ्रांस्वा ब्यूकैमप, आपका समाधान पूरी तरह से ठीक और बहुत बेहतर काम करता है।
अहसान

3 नंबर के साथ एक सीधा और अच्छा है!
कोजो

29

कस्टम तुलना फ़ंक्शन का उपयोग करने के बजाय, आप कस्टम toString()विधि के साथ ऑब्जेक्ट प्रकार भी बना सकते हैं (जो कि डिफ़ॉल्ट तुलना फ़ंक्शन द्वारा लागू किया जाता है):

function Person(firstName, lastName) {
    this.firtName = firstName;
    this.lastName = lastName;
}

Person.prototype.toString = function() {
    return this.lastName + ', ' + this.firstName;
}

var persons = [ new Person('Lazslo', 'Jamf'), ...]
persons.sort();

29

Lodash.js ( अंडरस्कोर के सुपरसेट )

यह तर्क के प्रत्येक सरल टुकड़े के लिए एक रूपरेखा जोड़ने के लिए अच्छा नहीं है, लेकिन अच्छी तरह से परीक्षण किए गए उपयोगिता ढांचे पर भरोसा करने से विकास को गति मिल सकती है और कीड़े की मात्रा कम हो सकती है।

लॉडश बहुत साफ कोड का उत्पादन करता है और एक अधिक कार्यात्मक प्रोग्रामिंग शैली को बढ़ावा देता है । एक झलक में यह स्पष्ट हो जाता है कि कोड का इरादा क्या है।

ओपी के मुद्दे को बस हल किया जा सकता है:

const sortedObjs = _.sortBy(objs, 'last_nom');

और जानकारी? उदाहरण के लिए हमारे पास नेस्टेड ऑब्जेक्ट है:

const users = [
  { 'user': {'name':'fred', 'age': 48}},
  { 'user': {'name':'barney', 'age': 36 }},
  { 'user': {'name':'wilma'}},
  { 'user': {'name':'betty', 'age': 32}}
];

हम अब उस संपत्ति का पथ निर्दिष्ट करने के लिए _.property शॉर्टहैंड user.ageका उपयोग कर सकते हैं जिसका मिलान किया जाना चाहिए। हम नेस्टेड उम्र की संपत्ति के आधार पर उपयोगकर्ता वस्तुओं को सॉर्ट करेंगे। हाँ, यह नेस्टेड संपत्ति मिलान के लिए अनुमति देता है!

const sortedObjs = _.sortBy(users, ['user.age']);

क्या यह उलटा चाहिए? कोई दिक्कत नहीं है। _.Reverse का उपयोग करें ।

const sortedObjs = _.reverse(_.sortBy(users, ['user.age']));

श्रृंखला का उपयोग करके दोनों को संयोजित करना चाहते हैं ?

const { chain } = require('lodash');
const sortedObjs = chain(users).sortBy('user.age').reverse().value();

या जब आप श्रृंखला पर प्रवाह पसंद करते हैं

const { flow, reverse, sortBy } = require('lodash/fp');
const sortedObjs = flow([sortBy('user.age'), reverse])(users); 

28

आप उपयोग कर सकते हैं

सबसे आसान तरीका: लॉडश

( https://lodash.com/docs/4.17.10#orderBy )

यह विधि _.sortBy की तरह है सिवाय इसके कि यह पुनरावृत्तियों के क्रमबद्ध क्रमों को निर्दिष्ट करने की अनुमति देता है। यदि आदेश अनिर्दिष्ट है, तो सभी मानों को बढ़ते क्रम में क्रमबद्ध किया जाता है। अन्यथा, इसी प्रकार के मूल्यों के आरोही क्रम के लिए अवरोही या "asc" के लिए "desc" का क्रम निर्दिष्ट करें।

तर्क

संग्रह (ऐरे | ऑब्जेक्ट): संग्रह से अधिक पुनरावृति करने के लिए। [iteratees = [_। पहचान]] (Array [] | फंक्शन [] | ऑब्जेक्ट [] | string []): iteratees द्वारा सॉर्ट करने के लिए। [आदेश] (स्ट्रिंग []): पुनरावृत्त के क्रम।

रिटर्न

(ऐरे): नए सॉर्ट किए गए सरणी देता है।


var _ = require('lodash');
var homes = [
    {"h_id":"3",
     "city":"Dallas",
     "state":"TX",
     "zip":"75201",
     "price":"162500"},
    {"h_id":"4",
     "city":"Bevery Hills",
     "state":"CA",
     "zip":"90210",
     "price":"319250"},
    {"h_id":"6",
     "city":"Dallas",
     "state":"TX",
     "zip":"75000",
     "price":"556699"},
    {"h_id":"5",
     "city":"New York",
     "state":"NY",
     "zip":"00010",
     "price":"962500"}
    ];

_.orderBy(homes, ['city', 'state', 'zip'], ['asc', 'desc', 'asc']);

23

यहां कई अच्छे उत्तर हैं, लेकिन मैं यह बताना चाहता हूं कि बहुत अधिक जटिल छंटाई को प्राप्त करने के लिए उन्हें बहुत सरलता से बढ़ाया जा सकता है। केवल एक चीज जो आपको करनी है, वह है ओआरओ ऑपरेटर का उपयोग इस तरह के तुलनात्मक कार्यों की श्रृंखला के लिए:

objs.sort((a,b)=> fn1(a,b) || fn2(a,b) || fn3(a,b) )

जहां fn1, fn2... एक प्रकार के कार्य हैं जो [-1,0,1] वापस आते हैं। इसके परिणामस्वरूप "fn1 द्वारा छँटाई", "fn2 द्वारा छँटाई" जो कि SQL में ORDER BY के बराबर है।

यह समाधान ||ऑपरेटर के व्यवहार पर आधारित है जो पहले मूल्यांकन की गई अभिव्यक्ति का मूल्यांकन करता है जिसे सच में परिवर्तित किया जा सकता है

सबसे सरल रूप में केवल एक इनलाइन फ़ंक्शन होता है:

// ORDER BY last_nom
objs.sort((a,b)=> a.last_nom.localeCompare(b.last_nom) )

दो चरणों के साथ last_nom, first_nomक्रम क्रम इस तरह दिखेगा:

// ORDER_BY last_nom, first_nom
objs.sort((a,b)=> a.last_nom.localeCompare(b.last_nom) || 
                  a.first_nom.localeCompare(b.first_nom)  )

एक सामान्य तुलनात्मक कार्य कुछ इस तरह हो सकता है:

// ORDER BY <n>
let cmp = (a,b,n)=>a[n].localeCompare(b[n])

इस फ़ंक्शन को संख्यात्मक क्षेत्रों, केस सेंसिटिविटी, आर्बिटरी डेटाैटिप्स आदि का समर्थन करने के लिए बढ़ाया जा सकता है।

आप उन्हें प्राथमिकता के आधार पर उनका उपयोग कर सकते हैं:

// ORDER_BY last_nom, first_nom
objs.sort((a,b)=> cmp(a,b, "last_nom") || cmp(a,b, "first_nom") )
// ORDER_BY last_nom, first_nom DESC
objs.sort((a,b)=> cmp(a,b, "last_nom") || -cmp(a,b, "first_nom") )
// ORDER_BY last_nom DESC, first_nom DESC
objs.sort((a,b)=> -cmp(a,b, "last_nom") || -cmp(a,b, "first_nom") )

यहाँ मुद्दा यह है कि कार्यात्मक दृष्टिकोण वाला शुद्ध जावास्क्रिप्ट आपको बाहरी पुस्तकालयों या जटिल कोड के बिना लंबा रास्ता तय कर सकता है। यह बहुत प्रभावी है, क्योंकि कोई स्ट्रिंग पार्सिंग नहीं करना है


23

उदाहरण उपयोग:

objs.sort(sortBy('last_nom'));

स्क्रिप्ट:

/**
 * @description
 * Returns a function which will sort an
 * array of objects by the given key.
 *
 * @param  {String}  key
 * @param  {Boolean} reverse
 * @return {Function}
 */
const sortBy = (key, reverse) => {

  // Move smaller items towards the front
  // or back of the array depending on if
  // we want to sort the array in reverse
  // order or not.
  const moveSmaller = reverse ? 1 : -1;

  // Move larger items towards the front
  // or back of the array depending on if
  // we want to sort the array in reverse
  // order or not.
  const moveLarger = reverse ? -1 : 1;

  /**
   * @param  {*} a
   * @param  {*} b
   * @return {Number}
   */
  return (a, b) => {
    if (a[key] < b[key]) {
      return moveSmaller;
    }
    if (a[key] > b[key]) {
      return moveLarger;
    }
    return 0;
  };
};

इसे नीचे तोड़ने के लिए धन्यवाद, मैं यह समझने की कोशिश कर रहा हूं कि अंकों 1, 0, -1को क्रमबद्ध करने के लिए क्यों उपयोग किया जाता है। ऊपर आपके स्पष्टीकरण के साथ भी, जो बहुत अच्छा लग रहा है - मैं अभी भी इसे काफी समझ नहीं पा रहा हूँ। मैं हमेशा सोचता हूं-1 सरणी लंबाई संपत्ति का उपयोग करते समय , अर्थात: arr.length = -1इसका मतलब यह नहीं है कि आइटम नहीं मिला है। मैं शायद यहां चीजों को मिला रहा हूं, लेकिन क्या आप मुझे यह समझने में मदद कर सकते 1, 0, -1हैं कि ऑर्डर निर्धारित करने के लिए अंकों का उपयोग क्यों किया जाता है? धन्यवाद।
क्रिस

1
यह पूरी तरह से सही नहीं है, लेकिन यह इस तरह से सोचने में मदद कर सकता है: array.sort को दिए गए फ़ंक्शन को सरणी में प्रत्येक आइटम के लिए एक बार कहा जाता है, जैसा कि "a" नाम का तर्क है। प्रत्येक फ़ंक्शन कॉल का वापसी मूल्य यह है कि आइटम "a" के सूचकांक (वर्तमान स्थिति संख्या) को अगले आइटम "b" की तुलना में कैसे बदला जाना चाहिए। सूचकांक सरणी (0, 1, 2 आदि) के क्रम को निर्धारित करता है इसलिए यदि "a" सूचकांक 5 पर है और आप -1 तो 5 + -1 == 4 (इसे आगे की ओर ले जाएँ) 5 + 0 == 5 (इसे जहां है वहां रखें) आदि यह हर बार 2 पड़ोसियों की तुलना करते हुए सरणी तक चलता है जब तक कि यह अंत तक नहीं पहुंचता है, एक सॉर्ट किए गए सरणी को छोड़ देता है।
जेमी मेसन

आगे यह समझाने के लिए समय निकालने के लिए धन्यवाद। इसलिए आपकी व्याख्या और MDN Array.prototyp.sort का उपयोग करते हुए , मैं आपको बताऊंगा कि मैं इस बारे में क्या सोच रहा हूं: की तुलना में aऔर bअगर, 1 aसे अधिक bके इंडेक्स से अधिक है aऔर इसे पीछे रखें b, यदि aइससे कम है b, से घटाएँ aऔर इसे सामने रखें b। अगर aऔर bसमान हैं, तो 0 को इसमें जोड़ें aऔर इसे वहीं छोड़ दें।
क्रिस

22

मैंने सुझाए गए इस विशेष दृष्टिकोण को नहीं देखा है, इसलिए यहाँ एक तुलनात्मक विधि है जो मुझे दोनों के लिए काम करने के लिए पसंद है stringऔर number:

const objs = [ 
  { first_nom: 'Lazslo', last_nom: 'Jamf'     },
  { first_nom: 'Pig',    last_nom: 'Bodine'   },
  { first_nom: 'Pirate', last_nom: 'Prentice' }
];

const sortBy = fn => (a, b) => {
  const fa = fn(a);
  const fb = fn(b);
  return -(fa < fb) || +(fa > fb);
};

const getLastName = o => o.last_nom;
const sortByLastName = sortBy(getLastName);

objs.sort(sortByLastName);
console.log(objs.map(getLastName));

यहाँ एक स्पष्टीकरण है sortBy():

sortBy() स्वीकार करता है a fn कि तुलना के रूप में उपयोग करने के लिए एक वस्तु से क्या मूल्य का चयन करता है, और एक फ़ंक्शन देता है जिसे सीधे पास किया जा सकता है Array.prototype.sort()। इस उदाहरण में, हम o.last_nomतुलना के लिए मूल्य के रूप में उपयोग कर रहे हैं , इसलिए जब भी हम दो वस्तुओं को प्राप्त करते हैं Array.prototype.sort()जैसे कि

{ first_nom: 'Lazslo', last_nom: 'Jamf' }

तथा

{ first_nom: 'Pig', last_nom: 'Bodine' }

हम प्रयोग करते हैं

(a, b) => {
  const fa = fn(a);
  const fb = fn(b);
  return -(fa < fb) || +(fa > fb);
};

उनकी तुलना करने के लिए।

वो याद है fn = o => o.last_nom , हम तुलना फ़ंक्शन को समकक्ष तक विस्तारित कर सकते हैं

(a, b) => {
  const fa = a.last_nom;
  const fb = b.last_nom;
  return -(fa < fb) || +(fa > fb);
};

तार्किक या || ऑपरेटर की एक छोटी-सी सर्कुलेटिंग कार्यक्षमता है जो यहाँ बहुत उपयोगी है। क्योंकि यह कैसे काम करता है, ऊपर दिए गए फ़ंक्शन का शरीर मतलब है

if (fa < fb) return -1;
if (fa > fb) return 1;
return 0;

एक अतिरिक्त बोनस के रूप में, यहाँ तीर कार्य के बिना ECMAScript 5 में बराबर है, जो दुर्भाग्य से अधिक क्रिया है:

var objs = [ 
  { first_nom: 'Lazslo', last_nom: 'Jamf'     },
  { first_nom: 'Pig',    last_nom: 'Bodine'   },
  { first_nom: 'Pirate', last_nom: 'Prentice' }
];

var sortBy = function (fn) {
  return function (a, b) {
    var fa = fn(a);
    var fb = fn(b);
    return -(fa < fb) || +(fa > fb);
  };
};

var getLastName = function (o) { return o.last_nom };
var sortByLastName = sortBy(getLastName);

objs.sort(sortByLastName);
console.log(objs.map(getLastName));


17

मुझे पता है कि यह प्रश्न बहुत पुराना है, लेकिन मुझे मेरे समान कोई कार्यान्वयन नहीं दिखाई दिया।
यह संस्करण श्वार्टजियन ट्रांसफॉर्म मुहावरे पर आधारित है ।

function sortByAttribute(array, ...attrs) {
  // generate an array of predicate-objects contains
  // property getter, and descending indicator
  let predicates = attrs.map(pred => {
    let descending = pred.charAt(0) === '-' ? -1 : 1;
    pred = pred.replace(/^-/, '');
    return {
      getter: o => o[pred],
      descend: descending
    };
  });
  // schwartzian transform idiom implementation. aka: "decorate-sort-undecorate"
  return array.map(item => {
    return {
      src: item,
      compareValues: predicates.map(predicate => predicate.getter(item))
    };
  })
  .sort((o1, o2) => {
    let i = -1, result = 0;
    while (++i < predicates.length) {
      if (o1.compareValues[i] < o2.compareValues[i]) result = -1;
      if (o1.compareValues[i] > o2.compareValues[i]) result = 1;
      if (result *= predicates[i].descend) break;
    }
    return result;
  })
  .map(item => item.src);
}

इसका उपयोग करने का एक उदाहरण यहां दिया गया है:

let games = [
  { name: 'Mashraki',          rating: 4.21 },
  { name: 'Hill Climb Racing', rating: 3.88 },
  { name: 'Angry Birds Space', rating: 3.88 },
  { name: 'Badland',           rating: 4.33 }
];

// sort by one attribute
console.log(sortByAttribute(games, 'name'));
// sort by mupltiple attributes
console.log(sortByAttribute(games, '-rating', 'name'));

14

वस्तुओं की छंटाई (अधिक) जटिल सारणी

चूंकि आप शायद इस सरणी की तरह अधिक जटिल डेटा संरचनाओं का सामना करते हैं, इसलिए मैं समाधान का विस्तार करूंगा।

टी एल; डॉ

अधिक सुंदर संस्करण @ ege-canzcan के बहुत प्यारे जवाब पर आधारित हैं ।

मुसीबत

मैंने नीचे का सामना किया और इसे बदल नहीं सका। मैं भी वस्तु को अस्थायी रूप से समतल नहीं करना चाहता था। न ही मैं अंडरस्कोर / लॉश का उपयोग करना चाहता था, मुख्य रूप से प्रदर्शन कारणों और इसे स्वयं लागू करने के लिए मज़ेदार।

var People = [
   {Name: {name: "Name", surname: "Surname"}, Middlename: "JJ"},
   {Name: {name: "AAA", surname: "ZZZ"}, Middlename:"Abrams"},
   {Name: {name: "Name", surname: "AAA"}, Middlename: "Wars"}
];

लक्ष्य

लक्ष्य यह है कि इसे मुख्य रूप से People.Name.nameऔर दूसरी तरह से हल किया जाएPeople.Name.surname

बाधाओं

अब, बेस समाधान में ब्रैकेट संकेतन का उपयोग गतिशील रूप से सॉर्ट करने के लिए गुणों की गणना करने के लिए किया जाता है। यहाँ, हालांकि, हमें गतिशील रूप से भी ब्रैकेट नोटेशन का निर्माण करना होगा, क्योंकि आप कुछ पसंद करेंगेPeople['Name.name'] काम करेंगे - जो नहीं करते हैं।

बस People['Name']['name']दूसरी ओर, स्थिर है और केवल आपको n को नीचे जाने की अनुमति देता है वें स्तर।

समाधान

यहां मुख्य जोड़ वस्तु के पेड़ के नीचे चलना और अंतिम पत्ती के मूल्य का निर्धारण करना होगा, आपको निर्दिष्ट करना होगा, साथ ही किसी भी मध्यवर्ती पत्ती को भी।

var People = [
   {Name: {name: "Name", surname: "Surname"}, Middlename: "JJ"},
   {Name: {name: "AAA", surname: "ZZZ"}, Middlename:"Abrams"},
   {Name: {name: "Name", surname: "AAA"}, Middlename: "Wars"}
];

People.sort(dynamicMultiSort(['Name','name'], ['Name', '-surname']));
// Results in...
// [ { Name: { name: 'AAA', surname: 'ZZZ' }, Middlename: 'Abrams' },
//   { Name: { name: 'Name', surname: 'Surname' }, Middlename: 'JJ' },
//   { Name: { name: 'Name', surname: 'AAA' }, Middlename: 'Wars' } ]

// same logic as above, but strong deviation for dynamic properties 
function dynamicSort(properties) {
  var sortOrder = 1;
  // determine sort order by checking sign of last element of array
  if(properties[properties.length - 1][0] === "-") {
    sortOrder = -1;
    // Chop off sign
    properties[properties.length - 1] = properties[properties.length - 1].substr(1);
  }
  return function (a,b) {
    propertyOfA = recurseObjProp(a, properties)
    propertyOfB = recurseObjProp(b, properties)
    var result = (propertyOfA < propertyOfB) ? -1 : (propertyOfA > propertyOfB) ? 1 : 0;
    return result * sortOrder;
  };
}

/**
 * Takes an object and recurses down the tree to a target leaf and returns it value
 * @param  {Object} root - Object to be traversed.
 * @param  {Array} leafs - Array of downwards traversal. To access the value: {parent:{ child: 'value'}} -> ['parent','child']
 * @param  {Number} index - Must not be set, since it is implicit.
 * @return {String|Number}       The property, which is to be compared by sort.
 */
function recurseObjProp(root, leafs, index) {
  index ? index : index = 0
  var upper = root
  // walk down one level
  lower = upper[leafs[index]]
  // Check if last leaf has been hit by having gone one step too far.
  // If so, return result from last step.
  if (!lower) {
    return upper
  }
  // Else: recurse!
  index++
  // HINT: Bug was here, for not explicitly returning function
  // https://stackoverflow.com/a/17528613/3580261
  return recurseObjProp(lower, leafs, index)
}

/**
 * Multi-sort your array by a set of properties
 * @param {...Array} Arrays to access values in the form of: {parent:{ child: 'value'}} -> ['parent','child']
 * @return {Number} Number - number for sort algorithm
 */
function dynamicMultiSort() {
  var args = Array.prototype.slice.call(arguments); // slight deviation to base

  return function (a, b) {
    var i = 0, result = 0, numberOfProperties = args.length;
    // REVIEW: slightly verbose; maybe no way around because of `.sort`-'s nature
    // Consider: `.forEach()`
    while(result === 0 && i < numberOfProperties) {
      result = dynamicSort(args[i])(a, b);
      i++;
    }
    return result;
  }
}

उदाहरण

जेएसबीएन पर काम करने का उदाहरण


2
क्यों? यह मूल प्रश्न का उत्तर नहीं है और "लक्ष्य" को People.sort (a, b) => {{a .Name.name.localeCompare (b.Name.name) || a.Name के साथ हल किया जा सकता है। .surname.localeCompare (b.Name.surname)})
तेरो टोलेनन

12

एक और विकल्प:

var someArray = [...];

function generateSortFn(prop, reverse) {
    return function (a, b) {
        if (a[prop] < b[prop]) return reverse ? 1 : -1;
        if (a[prop] > b[prop]) return reverse ? -1 : 1;
        return 0;
    };
}

someArray.sort(generateSortFn('name', true));

डिफ़ॉल्ट रूप से आरोही प्रकार।


1
कई क्षेत्रों द्वारा छँटाई के लिए थोड़ा बदला हुआ संस्करण यहाँ है: यदि आवश्यक हो तो: stackoverflow.com/questions/6913512/…
रावण समंदरो

ऐसा लगता है कि यह अगला हो सकता है: निर्यात फ़ंक्शन जनरेटफोर्ट (प्रोप: स्ट्रिंग, रिवर्स: बूलियन = गलत): (... args: कोई भी) => संख्या {वापसी (ए, बी) => {वापसी एक [प्रोप ] <b [प्रोप]? उलटना ? 1: -1: एक [प्रोप]> बी [प्रोप]? उलटना ? -1: 1: 0; }; }
डेन कर्नी

मैं कम से कम एक से अधिक पठनीय कोड पसंद करूंगा।
रावशन समंदारोव

सहमत हुए, लेकिन कुछ मामलों में मुझे उपयोगिता कार्यों को देखने की आवश्यकता नहीं है।
डेन कर्नी

11

एक साधारण फ़ंक्शन जो किसी गुण द्वारा ऑब्जेक्ट की एक सरणी को सॉर्ट करता है

function sortArray(array, property, direction) {
    direction = direction || 1;
    array.sort(function compare(a, b) {
        let comparison = 0;
        if (a[property] > b[property]) {
            comparison = 1 * direction;
        } else if (a[property] < b[property]) {
            comparison = -1 * direction;
        }
        return comparison;
    });
    return array; // Chainable
}

उपयोग:

var objs = [ 
    { first_nom: 'Lazslo', last_nom: 'Jamf'     },
    { first_nom: 'Pig',    last_nom: 'Bodine'   },
    { first_nom: 'Pirate', last_nom: 'Prentice' }
];

sortArray(objs, "last_nom"); // Asc
sortArray(objs, "last_nom", -1); // Desc

इस समाधान ने मुझे द्वि-दिशात्मक क्रमबद्ध करने के लिए पूरी तरह से काम किया। धन्यवाद यू
मंजुव्रेदी

10

एक सरल तरीका:

objs.sort(function(a,b) {
  return b.last_nom.toLowerCase() < a.last_nom.toLowerCase();
});

देखें कि '.toLowerCase()'तार की तुलना में कटाव को रोकने के लिए आवश्यक है।


4
आप कोड को थोड़ा और सुरुचिपूर्ण बनाने के लिए तीर फ़ंक्शंस का उपयोग कर सकते हैं :objs.sort( (a,b) => b.last_nom.toLowerCase() < a.last_nom.toLowerCase() );
Sertage

यह उसी कारण से गलत है, जैसा यहां बताया गया है
पैट्रिक रॉबर्ट्स

2
तीर कार्य ES5- योग्य नहीं हैं। टन के इंजन अभी भी ES5 तक ही सीमित हैं। मेरे मामले में, मुझे एक ES5 इंजन (मेरी कंपनी द्वारा मजबूर) पर काफी बेहतर होने के बाद से बेहतर उत्तर मिला
dylanh724

9

के लिए अतिरिक्त desc पैरामीटर Ege Özcan कोड

function dynamicSort(property, desc) {
    if (desc) {
        return function (a, b) {
            return (a[property] > b[property]) ? -1 : (a[property] < b[property]) ? 1 : 0;
        }   
    }
    return function (a, b) {
        return (a[property] < b[property]) ? -1 : (a[property] > b[property]) ? 1 : 0;
    }
}

9

विनय के विचार के साथ ईजी के गतिशील समाधान के संयोजन से, आपको एक अच्छा मजबूत समाधान मिलेगा:

Array.prototype.sortBy = function() {
    function _sortByAttr(attr) {
        var sortOrder = 1;
        if (attr[0] == "-") {
            sortOrder = -1;
            attr = attr.substr(1);
        }
        return function(a, b) {
            var result = (a[attr] < b[attr]) ? -1 : (a[attr] > b[attr]) ? 1 : 0;
            return result * sortOrder;
        }
    }
    function _getSortFunc() {
        if (arguments.length == 0) {
            throw "Zero length arguments not allowed for Array.sortBy()";
        }
        var args = arguments;
        return function(a, b) {
            for (var result = 0, i = 0; result == 0 && i < args.length; i++) {
                result = _sortByAttr(args[i])(a, b);
            }
            return result;
        }
    }
    return this.sort(_getSortFunc.apply(null, arguments));
}

उपयोग:

// Utility for printing objects
Array.prototype.print = function(title) {
    console.log("************************************************************************");
    console.log("**** "+title);
    console.log("************************************************************************");
    for (var i = 0; i < this.length; i++) {
        console.log("Name: "+this[i].FirstName, this[i].LastName, "Age: "+this[i].Age);
    }
}

// Setup sample data
var arrObj = [
    {FirstName: "Zach", LastName: "Emergency", Age: 35},
    {FirstName: "Nancy", LastName: "Nurse", Age: 27},
    {FirstName: "Ethel", LastName: "Emergency", Age: 42},
    {FirstName: "Nina", LastName: "Nurse", Age: 48},
    {FirstName: "Anthony", LastName: "Emergency", Age: 44},
    {FirstName: "Nina", LastName: "Nurse", Age: 32},
    {FirstName: "Ed", LastName: "Emergency", Age: 28},
    {FirstName: "Peter", LastName: "Physician", Age: 58},
    {FirstName: "Al", LastName: "Emergency", Age: 51},
    {FirstName: "Ruth", LastName: "Registration", Age: 62},
    {FirstName: "Ed", LastName: "Emergency", Age: 38},
    {FirstName: "Tammy", LastName: "Triage", Age: 29},
    {FirstName: "Alan", LastName: "Emergency", Age: 60},
    {FirstName: "Nina", LastName: "Nurse", Age: 54}
];

//Unit Tests
arrObj.sortBy("LastName").print("LastName Ascending");
arrObj.sortBy("-LastName").print("LastName Descending");
arrObj.sortBy("LastName", "FirstName", "-Age").print("LastName Ascending, FirstName Ascending, Age Descending");
arrObj.sortBy("-FirstName", "Age").print("FirstName Descending, Age Ascending");
arrObj.sortBy("-Age").print("Age Descending");

1
विचार के लिए धन्यवाद! वैसे, कृपया लोगों को ऐरे प्रोटोटाइप को बदलने के लिए प्रोत्साहित न करें (मेरे उदाहरण के अंत में चेतावनी देखें)।
एग

8

अपने उदाहरण को दर्ज करते हुए, आपको दो फ़ील्ड (अंतिम नाम, पहला नाम) को क्रमबद्ध करना होगा, बल्कि तब एक। इस पंक्ति को एक पंक्ति में बनाने के लिए आप Alasql लाइब्रेरी का उपयोग कर सकते हैं :

var res = alasql('SELECT * FROM ? ORDER BY last_nom, first_nom',[objs]);

इस उदाहरण को jsFiddle पर आज़माएं


8
objs.sort(function(a,b){return b.last_nom>a.last_nom})

1
वास्तव में यह काम करने के लिए नहीं लगता था, स्वीकृत उत्तर का उपयोग करना पड़ता था। यह सही ढंग से हल नहीं कर रहा था।
मैडप्रॉप्स

8

मूल उदाहरण दिया:

var objs = [ 
    { first_nom: 'Lazslo', last_nom: 'Jamf'     },
    { first_nom: 'Pig',    last_nom: 'Bodine'   },
    { first_nom: 'Pirate', last_nom: 'Prentice' }
];

कई क्षेत्रों के आधार पर छाँटें:

objs.sort(function(left, right) {
    var last_nom_order = left.last_nom.localeCompare(right.last_nom);
    var first_nom_order = left.first_nom.localeCompare(right.first_nom);
    return last_nom_order || first_nom_order;
});

टिप्पणियाँ

  • a.localeCompare(b)है सार्वभौमिक समर्थित और रिटर्न -1,0,1 अगर a<b, a==b, a>bक्रमशः।
  • ||अंतिम पंक्ति में last_nomप्राथमिकता देता हैfirst_nom
  • संख्यात्मक क्षेत्रों पर घटाव काम करता है: var age_order = left.age - right.age;
  • नेगेट को रिवर्स ऑर्डर, return -last_nom_order || -first_nom_order || -age_order;

7

भ्रम से बचाव के लिए आपको उन्हें निचले मामले में बदलने की आवश्यकता हो सकती है।

objs.sort(function (a,b) {

var nameA=a.last_nom.toLowerCase(), nameB=b.last_nom.toLowerCase()

if (nameA < nameB)
  return -1;
if (nameA > nameB)
  return 1;
return 0;  //no sorting

})

7
function compare(propName) {
    return function(a,b) {
        if (a[propName] < b[propName])
            return -1;
        if (a[propName] > b[propName])
            return 1;
        return 0;
    };
}

objs.sort(compare("last_nom"));

1
कृपया अपने कोड को संपादित करने पर विचार करें कि आपका कोड क्या करता है और यह समस्या का समाधान क्यों करेगा, इसके बारे में अधिक विवरण जोड़ने के लिए। एक जवाब जो ज्यादातर सिर्फ कोड होता है (भले ही यह काम कर रहा हो) आमतौर पर ओपी को उनकी समस्या को समझने में मदद नहीं करेगा।
Drenmi

7

रामदा का उपयोग करना,

npm रमड़ा स्थापित करें

import R from 'ramda'
var objs = [ 
    { first_nom: 'Lazslo', last_nom: 'Jamf'     },
    { first_nom: 'Pig',    last_nom: 'Bodine'   },
    { first_nom: 'Pirate', last_nom: 'Prentice' }
];
var ascendingSortedObjs = R.sortBy(R.prop('last_nom'), objs)
var descendingSortedObjs = R.reverse(ascendingSortedObjs)

7

इसे इस्तेमाल करे,

UPTO ES5

//Ascending Sort
items.sort(function (a, b) {
   return a.value - b.value;
});


//Descending Sort
items.sort(function (a, b) {
   return b.value - a.value;
});


IN ES6 & above:

// Ascending sort
items.sort((a, b) => a.value - b.value);

// Descending Sort
 items.sort((a, b) => b.value - a.value);

सबसे अच्छा और आसान उपाय
उमर हसन

6

यह एक साधारण समस्या है, पता नहीं क्यों लोगों के पास ऐसे जटिल समाधान होते हैं।
एक साधारण सॉर्ट फ़ंक्शन ( त्वरित-सॉर्ट एल्गोरिथ्म पर आधारित ):

function sortObjectsArray(objectsArray, sortKey)
        {
            // Quick Sort:
            var retVal;

            if (1 < objectsArray.length)
            {
                var pivotIndex = Math.floor((objectsArray.length - 1) / 2);  // middle index
                var pivotItem = objectsArray[pivotIndex];                    // value in the middle index
                var less = [], more = [];

                objectsArray.splice(pivotIndex, 1);                          // remove the item in the pivot position
                objectsArray.forEach(function(value, index, array)
                {
                    value[sortKey] <= pivotItem[sortKey] ?                   // compare the 'sortKey' proiperty
                        less.push(value) :
                        more.push(value) ;
                });

                retVal = sortObjectsArray(less, sortKey).concat([pivotItem], sortObjectsArray(more, sortKey));
            }
            else
            {
                retVal = objectsArray;
            }

            return retVal;
        }

उदाहरण का उपयोग करें:

var myArr = 
        [
            { val: 'x', idx: 3 },
            { val: 'y', idx: 2 },
            { val: 'z', idx: 5 },
        ];
myArr = sortObjectsArray(myArr, 'idx');

5
जेएस में एक सरल समाधान में त्वरित प्रकार को कैसे लागू किया जाता है? सरल एल्गोरिथ्म लेकिन एक सरल समाधान नहीं है।
एंड्रयू

यह सरल है क्योंकि यह किसी भी बाहरी पुस्तकालयों का उपयोग नहीं करता है और यह ऑब्जेक्ट के प्रोटोटाइप को नहीं बदलता है। मेरी राय में, कोड की जटिलता का कोड की जटिलता पर सीधा प्रभाव नहीं पड़ता है
Gil Epshtain

2
खैर, मुझे अलग-अलग शब्दों के साथ प्रयास करने दें: पहिया को कैसे मजबूत करना एक सरल उपाय है?
रॉबर्टो 14
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.