সমস্যা বিবরণ
নেস্টেড অবজেক্টের একটি অ্যারে দেওয়া আছে যেখানে প্রতিটি অবজেক্টে legs অ্যারে আছে। একটি ক্যারিয়ার নাম দিয়ে ফিল্টার করতে হবে যাতে সেই ক্যারিয়ারের লেগ থাকা অবজেক্টগুলো মात्र থাকে।
ইনপুট:
const arr = [{
id: 1,
legs: [{ carrierName: 'Pegasus' }]
}, {
id: 2,
legs: [{ carrierName: 'SunExpress' }, { carrierName: 'SunExpress' }]
}, {
id: 3,
legs: [{ carrierName: 'Pegasus' }, { carrierName: 'SunExpress' }]
}];
সার্চ কুয়েরি: "Pegasus"
আউটপুট: id 1 এবং 3 वाले অবজেক্টগুলো।
সমাধান
const arr = [{
id: 1,
legs: [{ carrierName: 'Pegasus' }]
}, {
id: 2,
legs: [{ carrierName: 'SunExpress' }, { carrierName: 'SunExpress' }]
}, {
id: 3,
legs: [{ carrierName: 'Pegasus' }, { carrierName: 'SunExpress' }]
}];
const keys = ['Pegasus'];
const filterByKeys = (arr = [], keys = []) => {
const res = arr.filter(function(item) {
const thisObj = this;
return item.legs.some(leg => {
return thisObj[leg.carrierName];
});
}, keys.reduce((acc, val) => {
acc[val] = true;
return acc;
}, Object.create(null)));
return res;
};
console.log(JSON.stringify(filterByKeys(arr, keys), undefined, 4));
আউটপুট
[
{
"id": 1,
"legs": [
{ "carrierName": "Pegasus" }
]
},
{
"id": 3,
"legs": [
{ "carrierName": "Pegasus" },
{ "carrierName": "SunExpress" }
]
}
]
কোড ব্যাখ্যা
keys.reduceদিয়ে ক্যারিয়ার নামগুলোকে লুকআপ অবজেক্টে রূপান্তর করা হয়েছে।filterএর দ্বিতীয় আর্গুমেন্ট হিসেবে লুকআপ অবজেক্ট পাস করা হয়েছে (thisহিসেবে)।item.legs.someদিয়ে যাচাই করা হয়েছে যে কোথাও ম্যাচিং ক্যারিয়ার আছে কিনা।