satyacode
Background
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