इन उत्तरों में से कोई भी एक तरह से कई क्षेत्रों का उपयोग करने के लिए एक सामान्य उद्देश्य विधि के रूप में आदर्श नहीं है। उपरोक्त सभी दृष्टिकोण अक्षम हैं क्योंकि उन्हें या तो सरणी को कई बार क्रमबद्ध करने की आवश्यकता होती है (जो, एक बड़ी पर्याप्त सूची में चीजों को बहुत कम कर सकती है) या वे बहुत बड़ी मात्रा में कचरा वस्तुओं को उत्पन्न करते हैं जिन्हें वीएम को साफ करने की आवश्यकता होगी (और अंततः धीमा करना होगा कार्यक्रम नीचे)।
यहाँ एक समाधान है कि तेजी से, कुशल है, आसानी से रिवर्स छँटाई की अनुमति देता है, और साथ इस्तेमाल किया जा सकता underscore
या lodash
, या के साथ सीधेArray.sort
सबसे महत्वपूर्ण हिस्सा compositeComparator
विधि है, जो तुलनित्र कार्यों की एक सरणी लेता है और एक नया समग्र तुलनित्र फ़ंक्शन देता है।
/**
* Chains a comparator function to another comparator
* and returns the result of the first comparator, unless
* the first comparator returns 0, in which case the
* result of the second comparator is used.
*/
function makeChainedComparator(first, next) {
return function(a, b) {
var result = first(a, b);
if (result !== 0) return result;
return next(a, b);
}
}
/**
* Given an array of comparators, returns a new comparator with
* descending priority such that
* the next comparator will only be used if the precending on returned
* 0 (ie, found the two objects to be equal)
*
* Allows multiple sorts to be used simply. For example,
* sort by column a, then sort by column b, then sort by column c
*/
function compositeComparator(comparators) {
return comparators.reduceRight(function(memo, comparator) {
return makeChainedComparator(comparator, memo);
});
}
आपको उन क्षेत्रों की तुलना करने के लिए एक तुलनित्र फ़ंक्शन की भी आवश्यकता होगी जिन्हें आप सॉर्ट करना चाहते हैं। naturalSort
समारोह एक विशेष क्षेत्र को देखते हुए एक तुलनित्र पैदा करेगा। रिवर्स सॉर्टिंग के लिए एक तुलनित्र लिखना तुच्छ भी है।
function naturalSort(field) {
return function(a, b) {
var c1 = a[field];
var c2 = b[field];
if (c1 > c2) return 1;
if (c1 < c2) return -1;
return 0;
}
}
(अब तक के सभी कोड पुन: प्रयोज्य हैं और उपयोगिता मॉड्यूल में रखे जा सकते हैं, उदाहरण के लिए)
अगला, आपको समग्र तुलनित्र बनाने की आवश्यकता है। हमारे उदाहरण के लिए, यह इस तरह दिखेगा:
var cmp = compositeComparator([naturalSort('roomNumber'), naturalSort('name')]);
यह कमरा नंबर, नाम के बाद क्रमबद्ध होगा। अतिरिक्त सॉर्ट मानदंड जोड़ना तुच्छ है और यह सॉर्ट के प्रदर्शन को प्रभावित नहीं करता है।
var patients = [
{name: 'John', roomNumber: 3, bedNumber: 1},
{name: 'Omar', roomNumber: 2, bedNumber: 1},
{name: 'Lisa', roomNumber: 2, bedNumber: 2},
{name: 'Chris', roomNumber: 1, bedNumber: 1},
];
// Sort using the composite
patients.sort(cmp);
console.log(patients);
निम्नलिखित लौटाता है
[ { name: 'Chris', roomNumber: 1, bedNumber: 1 },
{ name: 'Lisa', roomNumber: 2, bedNumber: 2 },
{ name: 'Omar', roomNumber: 2, bedNumber: 1 },
{ name: 'John', roomNumber: 3, bedNumber: 1 } ]
इस विधि को पसंद करने का कारण यह है कि यह खेतों की एक मनमानी संख्या पर तेजी से छंटाई की अनुमति देता है, बहुत अधिक कचरा उत्पन्न नहीं करता है या सॉर्ट के अंदर स्ट्रिंग संघनन करता है और आसानी से उपयोग किया जा सकता है ताकि ऑर्डर कॉलम प्राकृतिक होने के दौरान कुछ छंटे हुए हैं। छांटते हैं।