ভূমিকা
মিক্সড টাইপ অ্যারে (নাম্বার এবং স্ট্রিং মিশ্রিত) থেকে সংখ্যা ও স্ট্রিং আলাদা করে, প্রতিটি গ্রুপকে আলাদা আলাদা সর্ট করার পদ্ধতি।
সম্পূর্ণ কোড
const arr = [1, 5, 'fd', 6, 'as', 'a', 'cx', 43, 's', 51, 7];
const sorter = (a, b) => {
const first = typeof a === 'number';
const second = typeof b === 'number';
if (first && second) {
return a - b; // দুটোই নাম্বার: সংখ্যাসারে সর্ট
} else if (first && !second) {
return -1; // a নাম্বার, b স্ট্রিং: a প্রথমে
} else if (!first && second) {
return 1; // a স্ট্রিং, b নাম্বার: b প্রথমে
} else {
return a > b ? 1 : -1; // দুটোই স্ট্রিং: লেক্সিকোগ্রাফিক্যালি
}
};
arr.sort(sorter);
console.log(arr);
// আউটপুট: [1, 5, 6, 7, 43, 51, 'a', 'as', 'cx', 'fd', 's']
কোড ব্যাখ্যা
কাস্টম কম্পারেটর ফাংশন `(a, b) => number`:
- প্রথম টাইপ চেক: `typeof a === 'number'`
- নাম্বার কে স্ট্রিংয়ের আগে রাখা (return -1 / 1)
- নাম্বার গ্রুপ: আউটवार্ড সর্ট (`a - b`)
- স্ট্রিং গ্রুপ: লেক্সিকোগ্রাফিক্যাল সর্ট (`a > b ? 1 : -1`)
আউটপুট
[1, 5, 6, 7, 43, 51, 'a', 'as', 'cx', 'fd', 's']
আধুনিক ও উন্নত পদ্ধতিগুলো
১. Partition + Sort (দুই পাস, বেশি পঠনযোগ্য)
const separateAndSort = (arr) => {
const numbers = arr.filter(x => typeof x === 'number').sort((a, b) => a - b);
const strings = arr.filter(x => typeof x === 'string').sort();
return [...numbers, ...strings];
};
২. Reduce + Sort (এক পাস পার্টিশন)
const separateAndSort = (arr) => {
const { nums, strs } = arr.reduce((acc, val) => {
(typeof val === 'number' ? acc.nums : acc.strs).push(val);
return acc;
}, { nums: [], strs: [] });
return [...nums.sort((a, b) => a - b), ...strs.sort()];
};
৩. Map + Sort (ফাংশনাল)
const separateAndSort = (arr) =>
[...arr.filter(x => typeof x === 'number').sort((a,b)=>a-b),
...arr.filter(x => typeof x === 'string').sort()];
৪. লোকেল-অযেয়ার স্ট্রিং সর্ট (Intl.Collator)
const collator = new Intl.Collator(undefined, { numeric: true, sensitivity: 'base' });
const separateAndSort = (arr) => {
const numbers = arr.filter(x => typeof x === 'number').sort((a, b) => a - b);
const strings = arr.filter(x => typeof x === 'string').sort(collator.compare);
return [...numbers, ...strings];
};
টাইপ চেকের উন্নত পদ্ধতি
// Number.isFinite() - NaN, Infinity বাদ
const isNumber = x => typeof x === 'number' && Number.isFinite(x);
// Object.prototype.toString - সঠিক টাইপ চেক
const getType = x => Object.prototype.toString.call(x).slice(8, -1).toLowerCase();
ব্যবহারিক অ্যাপ্লিকেশন
- ফর্ম ভ্যালিডেশন: মিক্সড ইনপুট ফিল্ড প্রসেসিং
- CSV পার্সিং: কোলাম টাইপ অনুযায়ী সর্ট
- ডেটা ভিজ্যুয়ালাইজেশন: লেজেন্ড অর্ডারিং
- API রেসপন্স নর্মালাইজেশন: কনসিস্টেন্ট আউটপুট
সারাংশ
কাস্টম কম্পারেটর কাজ করে, কিন্তু `filter` + `sort` প্যাটার্ন বেশি পঠনযোগ্য, মেইনটেইনযোগ্য এবং ফাংশনাল। টাইপ চেকের জন্য `Number.isFinite()` ব্যবহার করুন।