I have an array of goods with price range "from, to"
const goods = [
{ name: "Sweets", prices: [0, 100] },
{ name: "Chocolate", prices: [500, null] },
{ name: "Cheesecake", prices: [100, 200] },
{ name: "Truffle", prices: [null, null] },
{ name: "Apple cake", prices: [null, 400] },
{ name: "Banana cake", prices: [50, 250] },
{ name: "Raspberry cake", prices: [200, null] },
{ name: "Donuts", prices: [51, 450] },
,
];
to filter them with required options where null in tuple [null, 200] means max price of product is 200 and [200, null] means min price of product is 200.
const requiredRange1 = [null, 200];
const requiredRange2 = [100, 350];
const requiredRange3 = [200, null];
const requiredRange4 = [200, 300];
const requiredRange5 = [1000, null];
for example: output of requiredRange1 is
[
{ name: "Sweets", prices: [0, 100] },
{ name: "Cheesecake", prices: [100, 200] },
{ name: "Apple cake", prices: [null, 400] },
{ name: "Banana cake", prices: [50, 250] },
{ name: "Raspberry cake", prices: [200, null] },
{ name: "Donuts", prices: [51, 450] },
]
I wrote a function
const filterCourses = (arrayOfCourses, requiredRange) => {
const [minRequiredPrice, maxRequiredPrice] = requiredRange;
const filterCallback = (course) => {
const maxCoursePrice = course.prices[1];
const minCoursePrice = course.prices[0];
if(minCoursePrice === null && maxCoursePrice === null) {
return false
}
if(minRequiredPrice === null) {
return maxRequiredPrice >= minCoursePrice
} else if(maxRequiredPrice === null) {
return minRequiredPrice <= maxCoursePrice || minCoursePrice >= minRequiredPrice
} else {
return (minRequiredPrice > maxCoursePrice && maxCoursePrice !== null) || (maxRequiredPrice < minCoursePrice && minCoursePrice !== null) ? false : true
}
}
const result = arrayOfCourses.filter(filterCallback)
return result
}
Looks pretty hard-coded, how can I filter this array with more elegant way?
More elegant:
function doRangesIntersect(a, b) {
const lo = Math.max(a[0] ?? -Infinity, b[0] ?? -Infinity);
const hi = Math.min(a[1] ?? Infinity, b[1] ?? Infinity);
return lo <= hi;
}
function filterCourses(arrayOfCourses, requiredRange) {
return arrayOfCourses.filter(course => doRangesIntersect(course.prices, requiredRange));
}