Pages

DS

---------------------------------------------

// Basket: a mixed list of fruits and vegetables
// Each item has properties describing what it is
// ---------------------------------------------
const basket = [
  {
    icon: "🍎",
    hasSeeds: true,
    color: "red",
    weight: 180,
    sweetness: 6,
    price: 1.2,
    category: "fruit",
  },
  {
    icon: "🥕",
    hasSeeds: false,
    color: "orange",
    weight: 80,
    sweetness: 4,
    price: 0.7,
    category: "vegetable",
  },
  {
    icon: "🍌",
    hasSeeds: false,
    color: "yellow",
    weight: 120,
    sweetness: 8,
    price: 1.0,
    category: "fruit",
  },
  {
    icon: "🥦",
    hasSeeds: false,
    color: "green",
    weight: 300,
    sweetness: 3,
    price: 1.8,
    category: "vegetable",
  },
  {
    icon: "🍓",
    hasSeeds: true,
    color: "red",
    weight: 25,
    sweetness: 9,
    price: 0.5,
    category: "fruit",
  },
  {
    icon: "🍆",
    hasSeeds: true,
    color: "purple",
    weight: 250,
    sweetness: 2,
    price: 2.1,
    category: "vegetable",
  },
  {
    icon: "🥝",
    hasSeeds: true,
    color: "green",
    weight: 75,
    sweetness: 7,
    price: 1.3,
    category: "fruit",
  },
  {
    icon: "🍍",
    hasSeeds: false,
    color: "yellow",
    weight: 900,
    sweetness: 5,
    price: 3.5,
    category: "fruit",
  },
];

/**
 * Custom implementation of Array.prototype.some()
 * ------------------------------------------------
 * @param {Array} array - the list we want to check
 * @param {Function} fxn - the test function applied to each element
 * @returns {boolean} - true if at least one element passes the test
 *
 * How it works:
 * - Loop through the array
 * - Apply the callback to each element
 * - If the callback returns true → stop and return true
 * - If no element matches → return false
 */
function mySome(array, fxn) {
  for (let i = 0; i < array.length; i++) {
    if (fxn(array[i])) {
      return true; // Found at least one matching item
    }
  }
  return false; // No match found
}

// ------------------------------------------------------
// Example 1: Check if the basket contains a vegetable
// Using a classic function expression
// ------------------------------------------------------
const hasVegetable = mySome(
  basket,
  function (basketItem) {
    return basketItem.category === "vegetable";
  }
);
console.log("Has vegetable?", hasVegetable); // true

// ------------------------------------------------------
// Example 2: Same test, but using an arrow function
// ------------------------------------------------------
const hasVegetable2 = mySome(
  basket,
  basketItem => basketItem.category === "vegetable"
);
console.log("Has vegetable?", hasVegetable2); // true

// ------------------------------------------------------
// Example 3: Store the callback in a variable
// ------------------------------------------------------
const hasVegetable3 = basketItem => basketItem.category === "vegetable";

const hasVegetable3Result = mySome(basket, hasVegetable3);

console.log("Has vegetable?", hasVegetable3Result); // true

// ------------------------------------------------------
// Example 4: Check if the basket contains an expensive item
// ------------------------------------------------------
const hasExpensiveItem = mySome(
  basket,
  basketItem => basketItem.price > 3
);
console.log("Has expensive item?", hasExpensiveItem); // true (🍍)

// ------------------------------------------------------
// Example 5: Check if the basket contains a seedless fruit
// ------------------------------------------------------
const seedlessFruit = mySome(
  basket,
  basketItem => basketItem.category === "fruit" && !basketItem.hasSeeds
);
console.log("Has seedless fruit?", seedlessFruit); // true (🍌, 🍍)