কম্পিউটার টিউটোরিয়াল

JavaScript-এ অবজেক্টের ফিল্ড উপস্থিতি অনুযায়ী অ্যারে সর্ট করা

ভূমিকা

এই আর্টিকেলে একটি অবজেক্ট অ্যারে সর্ট করার পদ্ধতি দেখানো হয়েছে যেখানে সর্টিং ক্রাইটেরিয়া হলো অবজেক্টে কোন ফিল্ডগুলো আছে: `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`-এর আগে যাবে
  • শূন্য: অর্ডার পরিবর্তন হবে না

লজিক:

  1. যদি `a`-তে `firstName` এবং `lastName` **দুটোই** থাকে → `a` প্রথমে (`return -1`)
  2. নাহলে, যদি `b`-তে `firstName` বা `lastName` **যেকোনো একটা** থাকে → `b` প্রথমে (`return 1`)
  3. অন্য সব কেসে (উভয়েই নেই) → `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);

সারাংশ

অবজেক্টের প্রপার্টি উপস্থিতি অনুযায়ী সর্ট করার জন্য কাস্টম কম্পারেটর ফাংশন ব্যবহার করুন। প্রায়োরিটি-ভিত্তিক সর্ট কী ফাংশন কোডকে আরও ক্লিন এবং বাগ-মুক্ত করে।

  1. জাভাস্ক্রিপ্ট অ্যারে অবজেক্ট গণনা করার উপায়

  2. জাভাস্ক্রিপ্টে TypedArray.sort() ফাংশন

  3. জাভাস্ক্রিপ্ট - অ্যারে অবজেক্টের length প্রোপার্টি

  4. জাভাস্ক্রিপ্টে Array.prototype.sort() মেথড