ভূমিকা
এই আর্টিকেলে একটি অবজেক্ট অ্যারে সর্ট করার পদ্ধতি দেখানো হয়েছে যেখানে সর্টিং ক্রাইটেরিয়া হলো অবজেক্টে কোন ফিল্ডগুলো আছে: `firstName` এবং `lastName` দুটোই থাকলে প্রথমে, যেকোনো একটা থাকলে মাঝপথে, আর কোনোটা না থাকলে শেষে।
সম্পূর্ণ কোড
const people = [
{ firstName: 'Ram', id: 301 },
{ firstName: 'Shyam', lastName: 'Singh', id: 1016 },
{ firstName: 'Dinesh', lastName: 'Lamba', id: 231 },
{ id: 341 },
{ firstName: 'Karan', lastName: 'Malhotra', id: 441 },
{ id: 8881 },
{ firstName: 'Vivek', id: 301 }
];
const sorter = (a, b) => {
if (a.firstName && a.lastName) {
return -1; // a اول
} else if (b.firstName || b.lastName) {
return 1; // b اول
} else {
return -1; // a اول (উভয়েই নেই)
}
};
people.sort(sorter);
console.log(people);
আউটপুট
[
{ firstName: 'Karan', lastName: 'Malhotra', id: 441 },
{ firstName: 'Dinesh', lastName: 'Lamba', id: 231 },
{ firstName: 'Shyam', lastName: 'Singh', id: 1016 },
{ firstName: 'Ram', id: 301 },
{ firstName: 'Vivek', id: 301 },
{ id: 8881 },
{ id: 341 }
]
কোড ব্যাখ্যা
সর্ট ফাংশন `(a, b) => number` রিটার্ন করে:
- নেগেটিভ: `a`, `b`-এর আগে যাবে
- পজিটিভ: `b`, `a`-এর আগে যাবে
- শূন্য: অর্ডার পরিবর্তন হবে না
লজিক:
- যদি `a`-তে `firstName` এবং `lastName` **দুটোই** থাকে → `a` প্রথমে (`return -1`)
- নাহলে, যদি `b`-তে `firstName` বা `lastName` **যেকোনো একটা** থাকে → `b` প্রথমে (`return 1`)
- অন্য সব কেসে (উভয়েই নেই) → `a` প্রথমে (`return -1`)
⚠️ লজিক্যাল সমস্যা ও সংশোধন
মূল কোডে একটি লজিক্যাল বাগ আছে: `else if` ব্লকটি `a`-র প্রপার্টি চেক করে না। সংশোধিত সংস্করণ:
const sorterFixed = (a, b) => {
const aHasBoth = a.firstName && a.lastName;
const bHasBoth = b.firstName && b.lastName;
const aHasOne = a.firstName || a.lastName;
const bHasOne = b.firstName || b.lastName;
if (aHasBoth && !bHasBoth) return -1; // a দুটোই আছে, b নেই
if (!aHasBoth && bHasBoth) return 1; // b দুটোই আছে, a নেই
if (aHasOne && !bHasOne) return -1; // a একটা আছে, b নেই
if (!aHasOne && bHasOne) return 1; // b একটা আছে, a নেই
return 0; // উভয়ে সমান অবস্থা
};
আধুনিক পদ্ধতি: সর্ট কী ফাংশন (Sort Key Function)
const getPriority = (obj) => {
if (obj.firstName && obj.lastName) return 0; // সর্বোচ্চ প্রায়োরিটি
if (obj.firstName || obj.lastName) return 1; // মাঝপথ প্রায়োরিটি
return 2; // নিম্নতম প্রায়োরিটি
};
people.sort((a, b) => getPriority(a) - getPriority(b));
তbürgerable সর্ট (Stable Sort) নিশ্চিত করা
ES2019+ এ `Array.prototype.sort()` স্ট্যাবল (stable) গ্যারান্টি দেয়। পুরানো এনভায়রনমেন্টে:
// ইনডেক্স যোগ করে স্ট্যাবল সর্ট
people.forEach((obj, i) => obj._originalIndex = i);
people.sort((a, b) => getPriority(a) - getPriority(b) || a._originalIndex - b._originalIndex);
সারাংশ
অবজেক্টের প্রপার্টি উপস্থিতি অনুযায়ী সর্ট করার জন্য কাস্টম কম্পারেটর ফাংশন ব্যবহার করুন। প্রায়োরিটি-ভিত্তিক সর্ট কী ফাংশন কোডকে আরও ক্লিন এবং বাগ-মুক্ত করে।