Back to js-functions
08-dhaba-rating.js
JavaScript
1/**
2 * 🍛 Highway Dhaba Rating System - Higher-Order Functions
3 *
4 * Highway pe dhabas ki rating system bana raha hai. Higher-order functions
5 * (HOF) use karne hain — aise functions jo doosre functions ko parameter mein lete hain YA return karte hain.
6 *
7 * Functions:
8 *
9 * 1. createFilter(field, operator, value)
10 * - Returns a FUNCTION that filters objects
11 * - Operators: ">", "<", ">=", "<=", "==="
12 * - e.g., createFilter("rating", ">=", 4) returns a function that
13 * takes an object and returns true if object.rating >= 4
14 * - Unknown operator => return function that always returns false
15 *
16 * 2. createSorter(field, order = "asc")
17 * - Returns a COMPARATOR function for Array.sort()
18 * - order "asc" => ascending, "desc" => descending
19 * - Works with both numbers and strings
20 *
21 * 3. createMapper(fields)
22 * - fields: array of field names, e.g., ["name", "rating"]
23 * - Returns a function that takes an object and returns a new object
24 * with ONLY the specified fields
25 * - e.g., createMapper(["name"])({name: "Dhaba", rating: 4}) => {name: "Dhaba"}
26 *
27 * 4. applyOperations(data, ...operations)
28 * - data: array of objects
29 * - operations: any number of functions to apply SEQUENTIALLY
30 * - Each operation takes an array and returns an array
31 * - Apply first operation to data, then second to result, etc.
32 * - Return final result
33 * - Agar data not array, return []
34 *
35 * Hint: HOF = functions that take functions as arguments or return functions.
36 * createFilter returns a function. applyOperations takes functions as args.
37 *
38 * @example
39 * const highRated = createFilter("rating", ">=", 4);
40 * highRated({ name: "Punjab Dhaba", rating: 4.5 }) // => true
41 *
42 * const byRating = createSorter("rating", "desc");
43 * [{ rating: 3 }, { rating: 5 }].sort(byRating)
44 * // => [{ rating: 5 }, { rating: 3 }]
45 */
46export function createFilter(field, operator, value) {
47 const operators = {
48 ">": (a, b)=> a > b,
49 "<": (a, b) => a < b,
50 ">=": (a, b) => a >= b,
51 "<=": (a, b) => a <= b,
52 "===": (a, b) => a === b,
53 }
54
55 return (obj)=> {
56 if(!operators[operator]) return false;
57 return operators[operator](obj[field], value);
58 }
59}
60
61export function createSorter(field, order = "asc") {
62 return (a, b) => {
63 if (a[field] < b[field]) return order === "asc" ? -1 : 1;
64 if (a[field] > b[field]) return order === "asc" ? 1 : -1;
65 return 0;
66 };
67}
68
69export function createMapper(fields) {
70 return (obj) => {
71 return fields.reduce((acc, field) => {
72 acc[field] = obj[field];
73 return acc;
74 }, {});
75 };
76}
77
78export function applyOperations(data, ...operations) {
79 if (!Array.isArray(data)) return [];
80 return operations.reduce((result, operation) => operation(result), data);
81}
82