आप कई स्तंभों पर एक सरणी कैसे सॉर्ट करते हैं?


119

मेरे पास एक बहुआयामी सरणी है। प्राथमिक सरणी एक सरणी है

[publicationID][publication_name][ownderID][owner_name] 

मैं जो करने की कोशिश कर रहा हूं वह सरणी को पहले owner_nameऔर बाद में क्रमबद्ध करता है publication_name। मुझे पता है कि आपके पास जावास्क्रिप्ट में Array.sort(), जिसमें आप एक कस्टम फ़ंक्शन डाल सकते हैं, मेरे मामले में मेरे पास है:

function mysortfunction(a, b) {
    var x = a[3].toLowerCase();
    var y = b[3].toLowerCase();

    return ((x < y) ? -1 : ((x > y) ? 1 : 0));
}

यह केवल स्वामी के नाम पर एक कॉलम पर सॉर्ट करने के लिए ठीक है, लेकिन मैं इसे owner_nameफिर से सॉर्ट करने के लिए कैसे संशोधित करूं publication_name?

जवाबों:


167

यदि स्वामी के नाम अलग-अलग हैं, तो उनके द्वारा क्रमबद्ध करें। अन्यथा, टाईब्रेकर के लिए प्रकाशन नाम का उपयोग करें।

function mysortfunction(a, b) {

  var o1 = a[3].toLowerCase();
  var o2 = b[3].toLowerCase();

  var p1 = a[1].toLowerCase();
  var p2 = b[1].toLowerCase();

  if (o1 < o2) return -1;
  if (o1 > o2) return 1;
  if (p1 < p2) return -1;
  if (p1 > p2) return 1;
  return 0;
}

@dcp मैं यह नहीं देखता कि यह दूसरी विशेषता को कैसे क्रमबद्ध कर सकता है। जब तक आप इसे चयनित कॉलमों की संख्या के रूप में नहीं लेते हैं .. क्या मैं सही हूं? जैसे[[A, 10], [J, 15], [A, 5], [J, 5]] => [[A, 10], [A, 5], [J, 15], [J, 5]]
Bla ...

2
@ user26409021 - नहीं, यह सही नहीं है। यह अंत में होगा [[ए, ५], [ए, १०], [जे, ५], [जे, १५]]। यह पहले विशेषता के आधार पर छाँटता है, और यदि वे समान हैं, तो यह दूसरी विशेषता के आधार पर छाँटता है। तो आपके उदाहरण में, A, J. से पहले आएगा। उस मामले में जहां A दो तत्वों के लिए समान है, तो वह दूसरी विशेषता का उपयोग करेगा। इसलिए [ए, १०], [ए, ५] के लिए, १० से पहले ५ आता है इसलिए यह आदेश देने के लिए [ए, ५], [ए, १०] के साथ समाप्त होगा। आपको जो चीज़ याद आ रही है वह यह है कि जब आप सॉर्टिंग पूरी होने तक Array.sort का उपयोग करते हैं तो mysortfunction को कई बार कहा जाता है।
डीसीपी

3
@ user26409021 - mysortfunction फ़ंक्शन में लूप की आवश्यकता नहीं है, क्योंकि Array.sort फ़ंक्शन को आवश्यकतानुसार तब तक कॉल करेगा जब तक कि Array ठीक से सॉर्ट न हो जाए। एक ही चीज mysortfunction के लिए जिम्मेदार है, यह निर्धारित करना कि क्या तर्क और b बराबर हैं, क्या a, b से कम है, या क्या a, b से अधिक है या नहीं। हमें उस दृढ़ संकल्प को बनाने के लिए लूप की आवश्यकता नहीं है। उम्मीद है की वो मदद करदे।
dcp

58

मुझे लगता है कि आप जो खोज रहे हैं वह तो है। प्रिय: https://github.com/Teun/thenBy.js

यह आपको मानक Array.sort का उपयोग करने की अनुमति देता है, लेकिन firstBy().thenBy().thenBy()स्टाइल के साथ ।

एक उदाहरण यहाँ देखा जा सकता है


बड़े डेटासेट पर प्रदर्शन से सावधान रहें। हर बार thenByकहा जाता है, सभी सरणी आइटम फिर से पाले जाते हैं।
रे शान

6
यह निश्चित रूप से ऐसा नहीं है। जब आप कॉल करते हैं तब (), यह एक नया फ़ंक्शन बनाता है जो पिछले एक को इनकैप्सूल करता है। छँटाई के समय, जावास्क्रिप्ट सख्ती से आइटमों के माध्यम से "लूप" नहीं करेगा, लेकिन यह उस फ़ंक्शन को कॉल करेगा जिसे आप इसे कई बार पास करते हैं। तब कॉल का उपयोग करके कॉल की संख्या नहीं बदलेगी। कुछ प्रदर्शन विचारों के लिए, पढ़ें: github.com/Teun/thenBy.js#a-word-on-performance
Teun D

2
मैं देखता हूं, मैं गलत था, प्रदर्शन के बारे में सोचने के लिए धन्यवाद। शायद नए कार्यों के साथ क्लोजर बनाने की स्मृति विचारों के बारे में एक नोट जोड़ें?
रे शान

यह कैसे एकाधिक गतिशील के लिए उपयोग करने के लिए? या एक पाश में?
हेमिल पटेल

@Harry यदि आप इसे काम करने के लिए नहीं प्राप्त कर सकते हैं, तो कृपया उदाहरण के साथ एक समस्या पोस्ट करें जिसे आप क्रमबद्ध नहीं कर सकते हैं, इसलिए अन्य भी सीख सकते हैं। आपकी मदद करके खुशी हुई। github.com/Teun/thenBy.js/issues
Teun D

35

कई क्षेत्रों पर तार करने के लिए एक अच्छा तरीका है कि तार का उपयोग किया जाए toLocaleCompareऔर बूलियन ऑपरेटर ||

कुछ इस तरह:

// Sorting record releases by name and then by title.
releases.sort((oldRelease, newRelease) => {
  const compareName = oldRelease.name.localeCompare(newRelease.name);
  const compareTitle = oldRelease.title.localeCompare(newRelease.title);

  return compareName || compareTitle;
})

यदि आप अधिक फ़ील्ड्स को सॉर्ट करना चाहते हैं, तो आप उन्हें अधिक बूलियन ऑपरेटर्स के साथ रिटर्न स्टेटमेंट पर चेन कर सकते हैं।


तथ्य की बात के रूप में, आप इसे .reduce()
ekkis के

हालाँकि, .localCompare()-1, 0, 1 लौटाता है, इसलिए मुझे नहीं लगता कि आपका समाधान || बूलियन्स के लिए अच्छा है
ekkis

10
@ekkis, 1 और -1 दोनों "सत्य" हैं, इसलिए यह एक बहुत ही सुंदर समाधान है। मैंने अभी यह किया है: sortItems = (a, b) => (a.distance - b.distance) || (a.name - b.name); और यह मेरी गैर-अचार की जरूरतों के लिए एक आकर्षण की तरह काम करता है।
बस्टस्ट

1
@ अपना रास्ता बेहतर है, क्योंकि यह (a.name - b.name)तब तक मूल्यांकन नहीं करता है जब तक कि आवश्यक न हो। चर बनाना सबसे पहले अतिरिक्त काम करता है भले ही इसकी आवश्यकता न हो।
andi

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

27

एसक्यूएल-शैली मिश्रित एस्क और डेस ऑब्जेक्ट सरणी प्रकारों को कुंजियों के आधार पर करने की आवश्यकता है।

ऊपर kennebec के समाधान ने मुझे इसे प्राप्त करने में मदद की:

Array.prototype.keySort = function(keys) {

keys = keys || {};

// via
// /programming/5223/length-of-javascript-object-ie-associative-array
var obLen = function(obj) {
    var size = 0, key;
    for (key in obj) {
        if (obj.hasOwnProperty(key))
            size++;
    }
    return size;
};

// avoiding using Object.keys because I guess did it have IE8 issues?
// else var obIx = function(obj, ix){ return Object.keys(obj)[ix]; } or
// whatever
var obIx = function(obj, ix) {
    var size = 0, key;
    for (key in obj) {
        if (obj.hasOwnProperty(key)) {
            if (size == ix)
                return key;
            size++;
        }
    }
    return false;
};

var keySort = function(a, b, d) {
    d = d !== null ? d : 1;
    // a = a.toLowerCase(); // this breaks numbers
    // b = b.toLowerCase();
    if (a == b)
        return 0;
    return a > b ? 1 * d : -1 * d;
};

var KL = obLen(keys);

if (!KL)
    return this.sort(keySort);

for ( var k in keys) {
    // asc unless desc or skip
    keys[k] = 
            keys[k] == 'desc' || keys[k] == -1  ? -1 
          : (keys[k] == 'skip' || keys[k] === 0 ? 0 
          : 1);
}

this.sort(function(a, b) {
    var sorted = 0, ix = 0;

    while (sorted === 0 && ix < KL) {
        var k = obIx(keys, ix);
        if (k) {
            var dir = keys[k];
            sorted = keySort(a[k], b[k], dir);
            ix++;
        }
    }
    return sorted;
});
return this;
};

नमूना उपयोग:

var obja = [
  {USER:"bob",  SCORE:2000, TIME:32,    AGE:16, COUNTRY:"US"},
  {USER:"jane", SCORE:4000, TIME:35,    AGE:16, COUNTRY:"DE"},
  {USER:"tim",  SCORE:1000, TIME:30,    AGE:17, COUNTRY:"UK"},
  {USER:"mary", SCORE:1500, TIME:31,    AGE:19, COUNTRY:"PL"},
  {USER:"joe",  SCORE:2500, TIME:33,    AGE:18, COUNTRY:"US"},
  {USER:"sally",    SCORE:2000, TIME:30,    AGE:16, COUNTRY:"CA"},
  {USER:"yuri", SCORE:3000, TIME:34,    AGE:19, COUNTRY:"RU"},
  {USER:"anita",    SCORE:2500, TIME:32,    AGE:17, COUNTRY:"LV"},
  {USER:"mark", SCORE:2000, TIME:30,    AGE:18, COUNTRY:"DE"},
  {USER:"amy",  SCORE:1500, TIME:29,    AGE:19, COUNTRY:"UK"}
];

var sorto = {
  SCORE:"desc",TIME:"asc", AGE:"asc"
};

obja.keySort(sorto);

निम्नलिखित पैदावार:

 0: {     USER: jane;     SCORE: 4000;    TIME: 35;       AGE: 16;    COUNTRY: DE;   }
 1: {     USER: yuri;     SCORE: 3000;    TIME: 34;       AGE: 19;    COUNTRY: RU;   }
 2: {     USER: anita;    SCORE: 2500;    TIME: 32;       AGE: 17;    COUNTRY: LV;   }
 3: {     USER: joe;      SCORE: 2500;    TIME: 33;       AGE: 18;    COUNTRY: US;   }
 4: {     USER: sally;    SCORE: 2000;    TIME: 30;       AGE: 16;    COUNTRY: CA;   }
 5: {     USER: mark;     SCORE: 2000;    TIME: 30;       AGE: 18;    COUNTRY: DE;   }
 6: {     USER: bob;      SCORE: 2000;    TIME: 32;       AGE: 16;    COUNTRY: US;   }
 7: {     USER: amy;      SCORE: 1500;    TIME: 29;       AGE: 19;    COUNTRY: UK;   }
 8: {     USER: mary;     SCORE: 1500;    TIME: 31;       AGE: 19;    COUNTRY: PL;   }
 9: {     USER: tim;      SCORE: 1000;    TIME: 30;       AGE: 17;    COUNTRY: UK;   }
 keySort: {  }

( यहां से एक प्रिंट फंक्शन का उपयोग करके )

यहाँ एक jsbin उदाहरण है

संपादित करें: साफ किया और gksub पर mksort.js के रूप में पोस्ट किया गया


17

यह सभी आकारों के अल्फा प्रकारों के लिए आसान है। इसे अनुक्रमित करें, जिसे आप तर्क के रूप में क्रमबद्ध करना चाहते हैं।

Array.prototype.deepSortAlpha= function(){
    var itm, L=arguments.length, order=arguments;

    var alphaSort= function(a, b){
        a= a.toLowerCase();
        b= b.toLowerCase();
        if(a== b) return 0;
        return a> b? 1:-1;
    }
    if(!L) return this.sort(alphaSort);

    this.sort(function(a, b){
        var tem= 0,  indx=0;
        while(tem==0 && indx<L){
            itm=order[indx];
            tem= alphaSort(a[itm], b[itm]); 
            indx+=1;        
        }
        return tem;
    });
    return this;
}

var arr= [[ "Nilesh","Karmshil"], ["Pranjal","Deka"], ["Susants","Ghosh"],
["Shiv","Shankar"], ["Javid","Ghosh"], ["Shaher","Banu"], ["Javid","Rashid"]];

arr.deepSortAlpha(1,0);

क्या मुझे पता है कि आपने यह डेटा कहां से इकट्ठा किया था [["नीलेश", "करमशिल"], ["प्रांजल", "डेका"], ["सुसंत", "घोष"], ["शिव", "शंकर]] , ["जावीद", "घोष"], ["शाहर", "बानू"], ["जाविद", "राशिद"]];
defau1t

11

मैं तार्किक या के साथ वांछित तरह के आदेश की तुलना में निर्मित और श्रृंखला का उपयोग करने का सुझाव देता हूं ||

function customSort(a, b) {
    return a[3].localeCompare(b[3]) || a[1].localeCompare(b[1]);
}

कार्य उदाहरण:

var array = [
    [0, 'Aluminium', 0, 'Francis'],
    [1, 'Argon', 1, 'Ada'],
    [2, 'Brom', 2, 'John'],
    [3, 'Cadmium', 3, 'Marie'],
    [4, 'Fluor', 3, 'Marie'],
    [5, 'Gold', 1, 'Ada'],
    [6, 'Kupfer', 4, 'Ines'],
    [7, 'Krypton', 4, 'Joe'],
    [8, 'Sauerstoff', 3, 'Marie'],
    [9, 'Zink', 5, 'Max']
];

array.sort(function (a, b) {
    return a[3].localeCompare(b[3]) || a[1].localeCompare(b[1]);
});

document.write('<pre>');
array.forEach(function (a) {
    document.write(JSON.stringify(a) + '<br>');
});


यह मेरे लिए बहुत अच्छा काम किया! समझने में भी सरल। धन्यवाद!
डैन्यू

यह बात है!!! *****
फ्रेड्रिक जोहानसन

8

आप 2 वैरिएबल को एक सॉर्ट में एक साथ रख सकते हैं और अपनी तुलना के लिए उपयोग कर सकते हैं।

list.sort(function(a,b){
   var aCat = a.var1 + a.var2;
   var bCat = b.var1 + b.var2;
   return (aCat > bCat ? 1 : aCat < bCat ? -1 : 0);
});

@GustavoRodrigues क्योंकि यह बहुत भंगुर है। यह कुछ इनपुट कुंजियों पर अपेक्षित फैशन को छांटने में विफल होगा क्योंकि यह केवल एक सीमांकक या अन्य अंतर के बिना दो भागों को एक साथ मिलाता है। विचार करें कि क्या आइटम X के लिए var1 और var2 "foo" और "baz" थे, जबकि आइटम Y के लिए var1 "foobl" था। जब सॉर्ट किया गया एक्स पहले आना चाहिए लेकिन इस मामले में यह दूसरा होगा। इस उत्तर पर सुधार किया जा सकता है लेकिन जैसा कि कहा गया है कि यह सुरक्षित नहीं है।
पीटर हैनसेन

4

मुझे मल्टीसोट्र मिला । यह कई छंटाई के लिए सरल, शक्तिशाली और छोटा पुस्तकालय है। मुझे डायनामिक्स सॉर्टिंग मापदंड के साथ वस्तुओं की एक सरणी को सॉर्ट करने की आवश्यकता थी:

const criteria = ['name', 'speciality']
const data = [
  { name: 'Mike', speciality: 'JS', age: 22 },
  { name: 'Tom', speciality: 'Java', age: 30 },
  { name: 'Mike', speciality: 'PHP', age: 40 },
  { name: 'Abby', speciality: 'Design', age: 20 },
]

const sorted = multisort(data, criteria)

console.log(sorted)
<script src="https://cdn.rawgit.com/peterkhayes/multisort/master/multisort.js"></script>

यह पुस्तकालय अधिक शक्तिशाली है, यह मेरा मामला था। कोशिश करो।


2

मैं ng-gridएक एपीआई से लौटे रिकॉर्ड के एक सरणी पर कई कॉलम के साथ काम कर रहा था और जरूरत थी, इसलिए मैं इस निफ्टी, डायनामिक मल्टी-सॉर्ट फ़ंक्शन के साथ आया।

सबसे पहले, ng-grid"ngGridSorted" के लिए एक "ईवेंट" फायर करता है और सॉर्ट का वर्णन करते हुए इस संरचना को वापस करता है:

sortData = {
    columns:    DOM Element,
    directions: [], //Array of string values desc or asc. Each index relating to the same index of fields
    fields:     [], //Array of string values
};

इसलिए मैंने एक ऐसा फ़ंक्शन बनाया जो गतिशील sortDataरूप से ऊपर दिखाए गए के आधार पर एक प्रकार का फ़ंक्शन उत्पन्न करेगा ( स्क्रॉल बार से डरो मत! यह केवल 50 पंक्तियों के बारे में है! इसके अलावा, मैं ढलान के बारे में क्षमा चाहता हूं। यह एक क्षैतिज स्थिति को रोकता है। स्क्रॉलबार! ):

function SortingFunction(sortData)
{
    this.sortData = sortData;

    this.sort = function(a, b)
    {
        var retval = 0;

        if(this.sortData.fields.length)
        {
            var i = 0;

            /*
                Determine if there is a column that both entities (a and b)
                have that are not exactly equal. The first one that we find
                will be the column we sort on. If a valid column is not
                located, then we will return 0 (equal).
            */
            while(  (   !a.hasOwnProperty(this.sortData.fields[i]) 
                    ||  !b.hasOwnProperty(this.sortData.fields[i]) 
                    ||  (a.hasOwnProperty(this.sortData.fields[i]) 
                        && b.hasOwnProperty(this.sortData.fields[i]) 
                        && a[this.sortData.fields[i]] === b[this.sortData.fields[i]])
                    ) && i < this.sortData.fields.length){
                i++;
            }

            if(i < this.sortData.fields.length)
            {
                /*
                    A valid column was located for both entities
                    in the SortData. Now perform the sort.
                */
                if(this.sortData.directions 
                && i < this.sortData.directions.length 
                && this.sortData.directions[i] === 'desc')
                {
                    if(a[this.sortData.fields[i]] > b[this.sortData.fields[i]])
                        retval = -1;
                    else if(a[this.sortData.fields[i]] < b[this.sortData.fields[i]])
                        retval = 1;
                }
                else
                {
                    if(a[this.sortData.fields[i]] < b[this.sortData.fields[i]])
                        retval = -1;
                    else if(a[this.sortData.fields[i]] > b[this.sortData.fields[i]])
                        retval = 1;
                }
            }
        }

        return retval;
    }.bind(this);
}

मैं तब अपने एपीआई के परिणामों को क्रमबद्ध करता हूं ( resultsजैसे):

results.sort(new SortingFunction(sortData).sort);

मुझे उम्मीद है कि कोई और इस समाधान का आनंद लेगा जितना मैं करता हूं! धन्यवाद!


किस प्रकार के डेटा पर कॉलम विकल्प का उपयोग किया जाता है?
एलेक्स होप ओ'कॉनर

2

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

t.sort( (a,b)=> a[3].localeCompare(b[3]) || a[1].localeCompare(b[1]) );

मैं मानता हूं कि आपका डेटा सरणी में let t = [ [publicationID, publication_name, ownderID, owner_name ], ... ]जहां owner_name = 3 और Publishing_name = 1 का सूचकांक है।


2

स्ट्रिंग अपेंडिंग विधि

आप एक स्ट्रिंग में मूल्यों को जोड़कर और स्ट्रिंग्स की तुलना करके कई मानों को सॉर्ट कर सकते हैं। यह एक कुंजी से दूसरे में अपवाह को रोकने के लिए एक स्प्लिट कुंजी वर्ण जोड़ने में सहायक है।

उदाहरण

const arr = [ 
    { a: 1, b: 'a', c: 3 },
    { a: 2, b: 'a', c: 5 },
    { a: 1, b: 'b', c: 4 },
    { a: 2, b: 'a', c: 4 }
]


function sortBy (arr, keys, splitKeyChar='~') {
    return arr.sort((i1,i2) => {
        const sortStr1 = keys.reduce((str, key) => str + splitKeyChar+i1[key], '')
        const sortStr2 = keys.reduce((str, key) => str + splitKeyChar+i2[key], '')
        return sortStr1.localeCompare(sortStr2)
    })
}

console.log(sortBy(arr, ['a', 'b', 'c']))


1
function multiSort() {

    var args =$.makeArray( arguments ),
        sortOrder=1, prop='', aa='',  b='';

    return function (a, b) {

       for (var i=0; i<args.length; i++){

         if(args[i][0]==='-'){
            prop=args[i].substr(1)
            sortOrder=-1
         }
         else{sortOrder=1; prop=args[i]}

         aa = a[prop].toLowerCase()
         bb = b[prop].toLowerCase()

         if (aa < bb) return -1 * sortOrder;
         if (aa > bb) return 1 * sortOrder;

       }

       return 0
    }

}
empArray.sort(multiSort( 'lastname','firstname')) Reverse with '-lastname'

1

कुछ वर्चुअल DOM h-functions रचना के आउटपुट से मेमोरी पूल ब्लॉक प्रदर्शित करते समय मुझे इसी तरह की समस्या थी। मूल रूप से मुझे दुनिया भर के खिलाड़ियों से परिणाम प्राप्त करने जैसे बहु-मापदंड डेटा को छांटने के समान समस्या का सामना करना पड़ा।

मैंने देखा है कि बहु-मापदंड छँटाई है:

- sort by the first column
- if equal, sort by the second
- if equal, sort by the third
-  etc... nesting and nesting if-else

और अगर आप परवाह नहीं करते हैं, तो आप जल्दी से असफल हो सकते हैं अगर एक और घोंसले के शिकार नरक में ... वादों के कॉलबैक नरक की तरह ...

अगर हम विकल्प के किस भाग का उपयोग करने का निर्णय करने के लिए "प्रेडिकेटेट" फ़ंक्शन लिखते हैं तो क्या होगा? विधेय बस है:

// useful for chaining test
const decide = (test, other) => test === 0 ? other : test

अब अपने वर्गीकरण परीक्षणों (byCountrySize, byAge, byGameType, byScore, byLevel ...) को लिखने के बाद, जो भी आवश्यक हो, आप अपने परीक्षणों (1 = asc, -1 = desc, 0 = अक्षम) का भार उठा सकते हैं, उन्हें एक सरणी में रख सकते हैं। , और इस तरह के एक 'निर्णय' समारोह को कम करने के लिए लागू होते हैं:

const multisort = (s1, s2) => {
  const bcs = -1 * byCountrySize(s1, s2) // -1 = desc 
  const ba =  1 *byAge(s1, s2)
  const bgt = 0 * byGameType(s1, s2) // 0 = doesn't matter
  const bs = 1 * byScore(s1, s2)
  const bl = -1 * byLevel(s1, s2) // -1 = desc

  // ... other weights and criterias

  // array order matters !
  return [bcs, ba, bgt, bs, bl].reduce((acc, val) => decide(val, acc), 0)
}

// invoke [].sort with custom sort...
scores.sort(multisort)

और वोइला! यह आप पर निर्भर है कि आप अपने स्वयं के मानदंड / भार / आदेशों को परिभाषित करें ... लेकिन आपको यह विचार मिलता है। उम्मीद है की यह मदद करेगा !

संपादित करें: * यह सुनिश्चित करें कि प्रत्येक कॉलम पर कुल छँटाई क्रम है * कॉलम आदेशों के बीच निर्भरता नहीं होने के बारे में पता होना चाहिए, और अन्य परिपत्र क्षमताएँ

अगर, नहीं, तो अस्थिर हो सकता है!


1

ES6 iterables (blinq) के साथ काम करने के लिए मेरा अपना पुस्तकालय (अन्य चीजों के अलावा) आसान बहु-स्तरीय छंटाई की अनुमति देता है

const blinq = window.blinq.blinq
// or import { blinq } from 'blinq'
// or const { blinq } = require('blinq')
const dates = [{
    day: 1, month: 10, year: 2000
  },
  {
    day: 1, month: 1, year: 2000
  },
  {
    day: 2, month: 1, year: 2000
  },
  {
    day: 1, month: 1, year: 1999
  },
  {
    day: 1, month: 1, year: 2000
  }
]
const sortedDates = blinq(dates)
  .orderBy(x => x.year)
  .thenBy(x => x.month)
  .thenBy(x => x.day);

console.log(sortedDates.toArray())
// or console.log([...sortedDates])
<script src="https://cdn.jsdelivr.net/npm/blinq@2.0.2"></script>


0

गीठहब से शोक

function sortMethodAsc(a, b) {
    return a == b ? 0 : a > b ? 1 : -1;
}

function sortMethodWithDirection(direction) { 
    if (direction === undefined || direction == "asc") {
        return sortMethodAsc;
    } else {
        return function(a, b) {
            return -sortMethodAsc(a, b);
        } 
    }
}

function sortMethodWithDirectionByColumn(columnName, direction){   
    const sortMethod = sortMethodWithDirection(direction)
    return function(a, b){
        return sortMethod(a[columnName], b[columnName]);
    } 
}

function sortMethodWithDirectionMultiColumn(sortArray) {
    //sample of sortArray
    // sortArray = [
    //     { column: "column5", direction: "asc" },
    //     { column: "column3", direction: "desc" }
    // ]
    const sortMethodsForColumn = (sortArray || []).map( item => sortMethodWithDirectionByColumn(item.column, item.direction) );
    return function(a,b) {
        let sorted = 0;
        let index = 0;
        while (sorted === 0 && index < sortMethodsForColumn.length) {
            sorted = sortMethodsForColumn[index++](a,b);
        }
        return sorted;
    }
} 

//=============================================
//=============================================
//=============================================
//test

var data = [
    {"CountryName":"Aruba","CountryCode":"ABW","GNI":280},{
        "CountryName":"Afghanistan","CountryCode":"ABW","GNI":280},{"CountryName":"Angola","CountryCode":"AGO","GNI":280},{"CountryName":"Albania","CountryCode":"ALB","GNI":4320},
        {"CountryName":"Arab World","CountryCode":"ARB","GNI":280},{"CountryName":"United Arab Emirates","CountryCode":"ARE","GNI":39130},
        {"CountryName":"Argentina","CountryCode":"ARG","GNI":13030},{"CountryName":"Armenia","CountryCode":"ARM","GNI":3990},{"CountryName":"American Samoa","CountryCode":"ASM","GNI":280},
        {"CountryName":"Antigua and Barbuda","CountryCode":"ATG","GNI":13810},{"CountryName":"Australia","CountryCode":"AUS","GNI":51360},
        {"CountryName":"Austria","CountryCode":"AUT","GNI":45440},{"CountryName":"Azerbaijan","CountryCode":"AZE","GNI":4080},{"CountryName":"Burundi","CountryCode":"BDI","GNI":280},
        {"CountryName":"Belgium","CountryCode":"BEL","GNI":41790},{"CountryName":"Benin","CountryCode":"BEN","GNI":800},{"CountryName":"Burkina Faso","CountryCode":"BFA","GNI":590},
        {"CountryName":"Bangladesh","CountryCode":"BGD","GNI":1470},{"CountryName":"Bulgaria","CountryCode":"BGR","GNI":7860},{"CountryName":"Bahrain","CountryCode":"BHR","GNI":21150},
        {"CountryName":"Bosnia and Herzegovina","CountryCode":"BIH","GNI":4910},{"CountryName":"Belarus","CountryCode":"BLR","GNI":5280},
        {"CountryName":"Belize","CountryCode":"BLZ","GNI":4390},{"CountryName":"Bolivia","CountryCode":"BOL","GNI":3130},{"CountryName":"Brazil","CountryCode":"BRA","GNI":8600},
        {"CountryName":"Barbados","CountryCode":"BRB","GNI":15270},{"CountryName":"Brunei Darussalam","CountryCode":"BRN","GNI":29600},
        {"CountryName":"Bhutan","CountryCode":"BTN","GNI":2660},{"CountryName":"Botswana","CountryCode":"BWA","GNI":6730},
        {"CountryName":"Central African Republic","CountryCode":"CAF","GNI":390},{"CountryName":"Canada","CountryCode":"CAN","GNI":42870},
        {"CountryName":"Central Europe and the Baltics","CountryCode":"CEB","GNI":13009},{"CountryName":"Switzerland","CountryCode":"CHE","GNI":80560},
        {"CountryName":"Chile","CountryCode":"CHL","GNI":13610},{"CountryName":"China","CountryCode":"CHN","GNI":8690},{"CountryName":"Cote d'Ivoire","CountryCode":"CIV","GNI":1580},
        {"CountryName":"Cameroon","CountryCode":"CMR","GNI":1370},{"CountryName":"Colombia","CountryCode":"COL","GNI":5890},{"CountryName":"Comoros","CountryCode":"COM","GNI":1280},
        {"CountryName":"Cabo Verde","CountryCode":"CPV","GNI":3030},{"CountryName":"Costa Rica","CountryCode":"CRI","GNI":11120},
        {"CountryName":"Caribbean small states","CountryCode":"CSS","GNI":8909},{"CountryName":"Cyprus","CountryCode":"CYP","GNI":23720},
        {"CountryName":"Czech Republic","CountryCode":"CZE","GNI":18160},{"CountryName":"Germany","CountryCode":"DEU","GNI":43490},
        {"CountryName":"Djibouti","CountryCode":"DJI","GNI":1880},{"CountryName":"Dominica","CountryCode":"DMA","GNI":6590},{"CountryName":"Denmark","CountryCode":"DNK","GNI":55220},
        {"CountryName":"Dominican Republic","CountryCode":"DOM","GNI":6630},{"CountryName":"Algeria","CountryCode":"DZA","GNI":3940},
        {"CountryName":"East Asia & Pacific (excluding high income)","CountryCode":"EAP","GNI":6987},{"CountryName":"Early-demographic dividend","CountryCode":"EAR","GNI":3352},
        {"CountryName":"East Asia & Pacific","CountryCode":"EAS","GNI":10171},{"CountryName":"Europe & Central Asia (excluding high income)","CountryCode":"ECA","GNI":7375},
        {"CountryName":"Europe & Central Asia","CountryCode":"ECS","GNI":22656},{"CountryName":"Ecuador","CountryCode":"ECU","GNI":5920},
        {"CountryName":"Euro area","CountryCode":"EMU","GNI":35645},{"CountryName":"Spain","CountryCode":"ESP","GNI":27180},{"CountryName":"Estonia","CountryCode":"EST","GNI":18190},
        {"CountryName":"Ethiopia","CountryCode":"ETH","GNI":740},{"CountryName":"European Union","CountryCode":"EUU","GNI":32784},
        {"CountryName":"Fragile and conflict affected situations","CountryCode":"FCS","GNI":1510},{"CountryName":"Finland","CountryCode":"FIN","GNI":44580},
        {"CountryName":"Fiji","CountryCode":"FJI","GNI":4970},{"CountryName":"France","CountryCode":"FRA","GNI":37970},{"CountryName":"Gabon","CountryCode":"GAB","GNI":6650},
        {"CountryName":"United Kingdom","CountryCode":"GBR","GNI":40530},{"CountryName":"Georgia","CountryCode":"GEO","GNI":3780},{"CountryName":"Ghana","CountryCode":"GHA","GNI":1880},
        {"CountryName":"Guinea","CountryCode":"GIN","GNI":790},{"CountryName":"Guinea-Bissau","CountryCode":"GNB","GNI":660},
        {"CountryName":"Equatorial Guinea","CountryCode":"GNQ","GNI":7050},{"CountryName":"Greece","CountryCode":"GRC","GNI":18090},
        {"CountryName":"Grenada","CountryCode":"GRD","GNI":9180},{"CountryName":"Guatemala","CountryCode":"GTM","GNI":4060},{"CountryName":"Guyana","CountryCode":"GUY","GNI":4500},
        {"CountryName":"High income","CountryCode":"HIC","GNI":40142},{"CountryName":"Honduras","CountryCode":"HND","GNI":2250},{"CountryName":"Heavily indebted poor countries (HIPC)","CountryCode":"HPC","GNI":904},{"CountryName":"Croatia","CountryCode":"HRV","GNI":12570},{"CountryName":"Haiti","CountryCode":"HTI","GNI":760},{"CountryName":"Hungary","CountryCode":"HUN","GNI":12870},{"CountryName":"IBRD only","CountryCode":"IBD","GNI":5745},{"CountryName":"IDA & IBRD total","CountryCode":"IBT","GNI":4620},{"CountryName":"IDA total","CountryCode":"IDA","GNI":1313},{"CountryName":"IDA blend","CountryCode":"IDB","GNI":1791},
        {"CountryName":"Indonesia","CountryCode":"IDN","GNI":3540},{"CountryName":"IDA only","CountryCode":"IDX","GNI":1074},{"CountryName":"India","CountryCode":"IND","GNI":1800},{"CountryName":"Ireland","CountryCode":"IRL","GNI":55290},{"CountryName":"Iraq","CountryCode":"IRQ","GNI":4630},{"CountryName":"Iceland","CountryCode":"ISL","GNI":60830},{"CountryName":"Israel","CountryCode":"ISR","GNI":37270},{"CountryName":"Italy","CountryCode":"ITA","GNI":31020},{"CountryName":"Jamaica","CountryCode":"JAM","GNI":4760},{"CountryName":"Jordan","CountryCode":"JOR","GNI":3980},{"CountryName":"Japan","CountryCode":"JPN","GNI":38550},{"CountryName":"Kazakhstan","CountryCode":"KAZ","GNI":7970},{"CountryName":"Kenya","CountryCode":"KEN","GNI":1460},{"CountryName":"Kyrgyz Republic","CountryCode":"KGZ","GNI":1130},
        {"CountryName":"Cambodia","CountryCode":"KHM","GNI":1230},{"CountryName":"Kiribati","CountryCode":"KIR","GNI":3010},{"CountryName":"St. Kitts and Nevis","CountryCode":"KNA","GNI":16240},{"CountryName":"Kuwait","CountryCode":"KWT","GNI":31430},{"CountryName":"Latin America & Caribbean (excluding high income)","CountryCode":"LAC","GNI":7470},{"CountryName":"Lao PDR","CountryCode":"LAO","GNI":2270},{"CountryName":"Lebanon","CountryCode":"LBN","GNI":8400},{"CountryName":"Liberia","CountryCode":"LBR","GNI":620},{"CountryName":"Libya","CountryCode":"LBY","GNI":5500},{"CountryName":"St. Lucia","CountryCode":"LCA","GNI":8830},{"CountryName":"Latin America & Caribbean","CountryCode":"LCN","GNI":8251},{"CountryName":"Least developed countries: UN classification","CountryCode":"LDC","GNI":1011},{"CountryName":"Low income","CountryCode":"LIC","GNI":774},{"CountryName":"Sri Lanka","CountryCode":"LKA","GNI":3850},{"CountryName":"Lower middle income","CountryCode":"LMC","GNI":2118},{"CountryName":"Low & middle income","CountryCode":"LMY","GNI":4455},{"CountryName":"Lesotho","CountryCode":"LSO","GNI":1210},{"CountryName":"Late-demographic dividend","CountryCode":"LTE","GNI":8518},{"CountryName":"Lithuania","CountryCode":"LTU","GNI":15200},{"CountryName":"Luxembourg","CountryCode":"LUX","GNI":70260},{"CountryName":"Latvia","CountryCode":"LVA","GNI":14740},{"CountryName":"Morocco","CountryCode":"MAR","GNI":2860},{"CountryName":"Moldova","CountryCode":"MDA","GNI":2200},{"CountryName":"Madagascar","CountryCode":"MDG","GNI":400},{"CountryName":"Maldives","CountryCode":"MDV","GNI":9760},
        {"CountryName":"Middle East & North Africa","CountryCode":"MEA","GNI":7236},{"CountryName":"Mexico","CountryCode":"MEX","GNI":8610},{"CountryName":"Marshall Islands","CountryCode":"MHL","GNI":4840},{"CountryName":"Middle income","CountryCode":"MIC","GNI":4942},{"CountryName":"Mali","CountryCode":"MLI","GNI":770},
        {"CountryName":"Malta","CountryCode":"MLT","GNI":24080},{"CountryName":"Myanmar","CountryCode":"MMR","GNI":1210},{"CountryName":"Middle East & North Africa (excluding high income)","CountryCode":"MNA","GNI":3832},{"CountryName":"Montenegro","CountryCode":"MNE","GNI":7400},{"CountryName":"Mongolia","CountryCode":"MNG","GNI":3270},{"CountryName":"Mozambique","CountryCode":"MOZ","GNI":420},{"CountryName":"Mauritania","CountryCode":"MRT","GNI":1100},{"CountryName":"Mauritius","CountryCode":"MUS","GNI":10130},{"CountryName":"Malawi","CountryCode":"MWI","GNI":320},{"CountryName":"Malaysia","CountryCode":"MYS","GNI":9650},{"CountryName":"North America","CountryCode":"NAC","GNI":56721},{"CountryName":"Namibia","CountryCode":"NAM","GNI":4570},{"CountryName":"Niger","CountryCode":"NER","GNI":360},{"CountryName":"Nigeria","CountryCode":"NGA","GNI":2100},
        {"CountryName":"Nicaragua","CountryCode":"NIC","GNI":2130},{"CountryName":"Netherlands","CountryCode":"NLD","GNI":46180},{"CountryName":"Norway","CountryCode":"NOR","GNI":75990},{"CountryName":"Nepal","CountryCode":"NPL","GNI":800},{"CountryName":"Nauru","CountryCode":"NRU","GNI":10220},{"CountryName":"New Zealand","CountryCode":"NZL","GNI":38970},{"CountryName":"OECD members","CountryCode":"OED","GNI":37273},{"CountryName":"Oman","CountryCode":"OMN","GNI":14440},{"CountryName":"Other small states","CountryCode":"OSS","GNI":12199},{"CountryName":"Pakistan","CountryCode":"PAK","GNI":1580},{"CountryName":"Panama","CountryCode":"PAN","GNI":13280},{"CountryName":"Peru","CountryCode":"PER","GNI":5960},{"CountryName":"Philippines","CountryCode":"PHL","GNI":3660},{"CountryName":"Palau","CountryCode":"PLW","GNI":12700},{"CountryName":"Papua New Guinea","CountryCode":"PNG","GNI":2340},{"CountryName":"Poland","CountryCode":"POL","GNI":12730},{"CountryName":"Pre-demographic dividend","CountryCode":"PRE","GNI":1379},{"CountryName":"Portugal","CountryCode":"PRT","GNI":19820},{"CountryName":"Paraguay","CountryCode":"PRY","GNI":5470},{"CountryName":"West Bank and Gaza","CountryCode":"PSE","GNI":3180},{"CountryName":"Pacific island small states","CountryCode":"PSS","GNI":3793},{"CountryName":"Post-demographic dividend","CountryCode":"PST","GNI":41609},{"CountryName":"Qatar","CountryCode":"QAT","GNI":60510},{"CountryName":"Romania","CountryCode":"ROU","GNI":10000},{"CountryName":"Russian Federation","CountryCode":"RUS","GNI":9230},{"CountryName":"Rwanda","CountryCode":"RWA","GNI":720},{"CountryName":"South Asia","CountryCode":"SAS","GNI":1729},{"CountryName":"Saudi Arabia","CountryCode":"SAU","GNI":20090},{"CountryName":"Sudan","CountryCode":"SDN","GNI":2380},{"CountryName":"Senegal","CountryCode":"SEN","GNI":1240},{"CountryName":"Singapore","CountryCode":"SGP","GNI":54530},{"CountryName":"Solomon Islands","CountryCode":"SLB","GNI":1920},{"CountryName":"Sierra Leone","CountryCode":"SLE","GNI":510},{"CountryName":"El Salvador","CountryCode":"SLV","GNI":3560},{"CountryName":"Serbia","CountryCode":"SRB","GNI":5180},{"CountryName":"Sub-Saharan Africa (excluding high income)","CountryCode":"SSA","GNI":1485},{"CountryName":"Sub-Saharan Africa","CountryCode":"SSF","GNI":1486},{"CountryName":"Small states","CountryCode":"SST","GNI":11099},{"CountryName":"Sao Tome and Principe","CountryCode":"STP","GNI":1770},{"CountryName":"Suriname","CountryCode":"SUR","GNI":5150},{"CountryName":"Slovak Republic","CountryCode":"SVK","GNI":16610},{"CountryName":"Slovenia","CountryCode":"SVN","GNI":22000},{"CountryName":"Sweden","CountryCode":"SWE","GNI":52590},{"CountryName":"Eswatini","CountryCode":"SWZ","GNI":2950},{"CountryName":"Seychelles","CountryCode":"SYC","GNI":14170},{"CountryName":"Chad","CountryCode":"TCD","GNI":640},{"CountryName":"East Asia & Pacific (IDA & IBRD countries)","CountryCode":"TEA","GNI":7061},
        {"CountryName":"Europe & Central Asia (IDA & IBRD countries)","CountryCode":"TEC","GNI":7866},{"CountryName":"Togo","CountryCode":"TGO","GNI":610},{"CountryName":"Thailand","CountryCode":"THA","GNI":5950},{"CountryName":"Tajikistan","CountryCode":"TJK","GNI":990},{"CountryName":"Turkmenistan","CountryCode":"TKM","GNI":6380},{"CountryName":"Latin America & the Caribbean (IDA & IBRD countries)","CountryCode":"TLA","GNI":8179},{"CountryName":"Timor-Leste","CountryCode":"TLS","GNI":1790},{"CountryName":"Middle East & North Africa (IDA & IBRD countries)","CountryCode":"TMN","GNI":3839},{"CountryName":"Tonga","CountryCode":"TON","GNI":4010},{"CountryName":"South Asia (IDA & IBRD)","CountryCode":"TSA","GNI":1729},
        {"CountryName":"Sub-Saharan Africa (IDA & IBRD countries)","CountryCode":"TSS","GNI":1486},{"CountryName":"Trinidad and Tobago","CountryCode":"TTO","GNI":15340},{"CountryName":"Tunisia","CountryCode":"TUN","GNI":3490},{"CountryName":"Turkey","CountryCode":"TUR","GNI":10940},{"CountryName":"Tuvalu","CountryCode":"TUV","GNI":4970},{"CountryName":"Tanzania","CountryCode":"TZA","GNI":910},{"CountryName":"Uganda","CountryCode":"UGA","GNI":600},{"CountryName":"Ukraine","CountryCode":"UKR","GNI":2390},{"CountryName":"Upper middle income","CountryCode":"UMC","GNI":8197},{"CountryName":"Uruguay","CountryCode":"URY","GNI":15250},{"CountryName":"United States","CountryCode":"USA","GNI":58270},{"CountryName":"Uzbekistan","CountryCode":"UZB","GNI":2000},{"CountryName":"St. Vincent and the Grenadines","CountryCode":"VCT","GNI":7390},{"CountryName":"Vietnam","CountryCode":"VNM","GNI":2160},{"CountryName":"Vanuatu","CountryCode":"VUT","GNI":2920},{"CountryName":"World","CountryCode":"WLD","GNI":10371},{"CountryName":"Samoa","CountryCode":"WSM","GNI":4090},{"CountryName":"Kosovo","CountryCode":"XKX","GNI":3900},
        {"CountryName":"South Africa","CountryCode":"ZAF","GNI":5430},{"CountryName":"Zambia","CountryCode":"ZMB","GNI":1290},{"CountryName":"Zimbabwe","CountryCode":"ZWE","GNI":1170},
        {"CountryName":"Zimbabwe","CountryCode":"ZWE","GNI":1171}];

    const sortMethod = sortMethodWithDirectionMultiColumn(
        [
            { column: "GNI", direction: "asc" },
            { column: "CountryCode", direction: "desc" }
        ]
    );
    let sortedData = data.sort(sortMethod);  
    
    
    console.log("sorted by: 1)column:GNI-asc, 2)column:CountryCode-desc") 
    console.table(sortedData);
    console.log(sortedData);
    


Stackoverflow में आपका स्वागत है। आपके द्वारा प्रदान किए गए उत्तर के अलावा, कृपया इस बात की संक्षिप्त व्याख्या प्रदान करें कि यह समस्या क्यों और कैसे ठीक होती है।
जेटी

0

मैंने हाल ही में एक माइक्रो-लाइब्रेरी को एनपीएम पर प्रकाशित किया है जिसे सॉर्ट-हेल्पर ( गीथूब पर स्रोत ) कहा जाता है । कॉलम को क्रमबद्ध करने के लिए कॉलम को व्यक्त करने के कई तरीके के साथ, सिंटैक्स के माध्यम से सरणी विधि के byलिए तुलनात्मक फ़ंक्शन बनाने के लिए सहायक को विचार करना है :sortitems.sort(by(column, ...otherColumns))

  • द्वारा कुंजी : persons.sort(by('lastName', 'firstName')),
  • तक चयनकर्ता : dates.sort(by(x => x.toISOString())),
  • में अवरोही क्रम : [3, 2, 4, 1].sort(by(desc(n => n)))[3, 2, 1, 0],
  • उपेक्षा कर मामले : ['B', 'D', 'c', 'a'].sort(by(ignoreCase(x => x))).join('')'aBcD'

यह अच्छा के समान है thenBy में उल्लेख किया है इस सवाल का जवाब है, लेकिन निम्नलिखित मतभेद है कि कुछ का स्वाद के लिए और अधिक हो सकता है के साथ:

  • ऑब्जेक्ट-ओरिएंटेड से अधिक कार्यात्मक दृष्टिकोण ( thenByधाराप्रवाह एपीआई देखें ) ,
  • एक वाक्यविन्यास एक बिट निडर और अभी भी बहुत पठनीय, प्राकृतिक लगभग SQL की तरह है।
  • पूरी तरह से टाइपस्क्रिप्ट में लागू किया गया है, प्रकार की सुरक्षा और प्रकार की स्पष्टता से लाभ उठाने के लिए।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.