এই উত্তরগুলির কোনওটিই এক ধরণের একাধিক ক্ষেত্র ব্যবহারের জন্য সাধারণ উদ্দেশ্য পদ্ধতি হিসাবে আদর্শ নয়। উপরের সমস্ত পদ্ধতির অকার্যকর কারণ তাদের হয় হয় একাধিকবার অ্যারে বাছাই করা প্রয়োজন (যা একটি বৃহত পর্যায়ে তালিকার সাহায্যে জিনিসগুলি অনেক ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে বেড়ে যায়) বা ভিএম পরিষ্কার করার জন্য তারা প্রচুর পরিমাণে আবর্জনা তৈরি করতে পারে (এবং শেষ পর্যন্ত ধীর গতিতে হবে) প্রোগ্রাম ডাউন)।
এখানে একটি সমাধান পাওয়া যাবে যে দ্রুত, কার্যকর, সহজে বিপরীত বাছাই অনুমতি দেয়, এবং ব্যবহার করা যেতে পারে 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ফাংশন একটি নির্দিষ্ট ক্ষেত্র দেয়া comparator তৈরি করবে। বিপরীত বাছাইয়ের জন্য একটি তুলনামূলক লেখা খুব নগণ্য।
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 } ]
যে কারণে আমি এই পদ্ধতির পছন্দ করি তা হ'ল এটি একটি স্বেচ্ছাসেবী ক্ষেত্রগুলিতে দ্রুত বাছাইয়ের অনুমতি দেয়, প্রচুর আবর্জনা তৈরি করে না বা সাজানোর ভিতরে স্ট্রিং কনটেনটেশন সম্পাদন করে না এবং সহজেই ব্যবহার করা যায় যাতে কিছু কলামগুলি বিপরীত অনুসারে বাছাই করা হয় যখন অর্ডার কলামগুলি প্রাকৃতিকভাবে ব্যবহার করে সাজান.