0

I've recently had some help adding randomisation on my practice project app and now I'm trying to add the last functionality on it but I can't get around.

I have this app that shuffles 7 objects from an array and presents them as a meal of the day for the entire week. For now, I've been able to have that same array logged 4 times and each of the 4 instances is shuffled from the other, but I've added other 3 arrays for a total of 4, and I'd like to have the app shuffling and logging each of those 4 arrays once.

English is not my primary language hopefully I've been clear enough.

const menu = {
    _meal: "",
    _price: 0,
    //Let set the new value of meal only if it's a string.
    set meal(mealToCheck) {
        if (typeof mealToCheck === "string") {
            return (this._meal = mealToCheck);
        }
    },
    //Let set the new value of price only if it's a number.
    set price(priceToCheck) {
        if (typeof priceToCheck === "number") {
            return (this._price = priceToCheck);
        }
    },
    //If both setters are true, then return a message using them, otherwise return message saying the values are wrong.
    get todaysSpecial() {
        if (this._meal && this._price) {
            return `'s Special is ${this._meal}, for just ${this._price}£!!`;
        } else {
            return "Meal and Price wasn't entered correctly!!";
        }
    }
};

//Array for the meal options and respective prices.
let meals = [
    {/*1*/name: "Pizza", price: 9},
    {/*2*/name: "Steak", price: 13},
    {/*3*/name: "Pie", price: 11},
    {/*4*/name: "Roast", price: 14},
    {/*5*/name: "Moussaka", price: 9},
    {/*6*/name: "Lasagne", price: 10},
    {/*7*/name: "Tacos", price: 9}
];
let meals1 = [
    {/*1*/name: "Omelette", price: 9},
    {/*2*/name: "Kebab", price: 13},
    {/*3*/name: "Ratatouille", price: 14},
    {/*4*/name: "Quiche", price: 9},
    {/*5*/name: "Burgers", price: 9},
    {/*6*/name: "Hot-Dogs", price: 10},
    {/*7*/name: "Burritos", price: 9}
];
let meals2 = [
    {/*1*/name: "Bourguignon", price: 10},
    {/*2*/name: "Stew", price: 14},
    {/*3*/name: "Fish&Chips", price: 15},
    {/*4*/name: "Fried Chicken", price: 10},
    {/*5*/name: "Cannelloni", price: 10},
    {/*6*/name: "Crepes", price: 11},
    {/*7*/name: "Gyros", price: 10}
];
let meals3 = [
    {/*1*/name: "Greek Salad", price: 11},
    {/*2*/name: "Seafood", price: 15},
    {/*3*/name: "Falafel", price: 16},
    {/*4*/name: "Wraps", price: 11},
    {/*5*/name: "Souvlaki", price: 11},
    {/*6*/name: "Shawarma", price: 12},
    {/*7*/name: "Quesadilla", price: 11}
]

//Shuffle function, creates two variables.
const shuffle = (array) => {
    let currentIndex = array.length,
        randomIndex;
    //The function starts from the array length and ends when reaches 0
    while (currentIndex !== 0) {
        //Assigns a random number to the variable, and each time it runs, it lowers the max number by 1.
        randomIndex = Math.floor(Math.random() * currentIndex);
        currentIndex--;
        //It swaps the current array element, with the one equivalent to the random number index.
        [array[currentIndex], array[randomIndex]] = [
            array[randomIndex],
            array[currentIndex]
        ];
    }
    return array;
}

let week = ["Week 1", "Week 2", "Week 3", "Week 4"];
const dayOfTheWeek = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"]
// meals = shuffle(meals);

//I've created a for loop to go through the new shuffled array.

for (let w = 0; w < week.length; w++) {
    console.log("\n" + week[w])
    meals = shuffle(meals);
    for (let i = 0; i < meals.length; i++) {
        //In here I'm saying that if the number of meals is equal to the week days, the weekly menu will be printed.
        if (meals.length === dayOfTheWeek.length) {
            menu.meal = meals[i].name;
            menu.price = meals[i].price;
            console.log(dayOfTheWeek[i] + menu.todaysSpecial);
            //If the meals are less, it will print how many need to be added.
        } else if (meals.length < dayOfTheWeek.length) {
            console.log(`You need to add ${Math.abs(meals.length - dayOfTheWeek.length)} meal(s) to the list!!!`)
            break;
            //If the meals are more, than it will print how many need to be removed.
        } else if (meals.length > dayOfTheWeek.length) {
            console.log(`You need to remove ${Math.abs(meals.length - dayOfTheWeek.length)} meal(s) from the list!!!`)
            break;
        }
    }
}

2
  • 1
    Put all the mealsX arrays in another array. Loop through that array and shuffle each of them. Commented Jun 7, 2022 at 0:34
  • Thanks, I've also tried that way a single array called meals, and then inside all the 4 arrays, but got stuck, I've been hitting my head for a day, sometimes got kind of close but never worked, any chance you can give an example, please? Commented Jun 7, 2022 at 0:43

1 Answer 1

1

Put all the meals arrays in another array:

let all_meals = [meal, meals1, meals2, meals3];

Then you can use all_meals[w] to get the meals for that week.

const menu = {
  _meal: "",
  _price: 0,
  //Let set the new value of meal only if it's a string.
  set meal(mealToCheck) {
    if (typeof mealToCheck === "string") {
      return (this._meal = mealToCheck);
    }
  },
  //Let set the new value of price only if it's a number.
  set price(priceToCheck) {
    if (typeof priceToCheck === "number") {
      return (this._price = priceToCheck);
    }
  },
  //If both setters are true, then return a message using them, otherwise return message saying the values are wrong.
  get todaysSpecial() {
    if (this._meal && this._price) {
      return `'s Special is ${this._meal}, for just ${this._price}£!!`;
    } else {
      return "Meal and Price wasn't entered correctly!!";
    }
  }
};

//Array for the meal options and respective prices.
//Array for the meal options and respective prices.
let meals = [
    {/*1*/name: "Pizza", price: 9},
    {/*2*/name: "Steak", price: 13},
    {/*3*/name: "Pie", price: 11},
    {/*4*/name: "Roast", price: 14},
    {/*5*/name: "Moussaka", price: 9},
    {/*6*/name: "Lasagne", price: 10},
    {/*7*/name: "Tacos", price: 9}
];
let meals1 = [
    {/*1*/name: "Omelette", price: 9},
    {/*2*/name: "Kebab", price: 13},
    {/*3*/name: "Ratatouille", price: 14},
    {/*4*/name: "Quiche", price: 9},
    {/*5*/name: "Burgers", price: 9},
    {/*6*/name: "Hot-Dogs", price: 10},
    {/*7*/name: "Burritos", price: 9}
];
let meals2 = [
    {/*1*/name: "Bourguignon", price: 10},
    {/*2*/name: "Stew", price: 14},
    {/*3*/name: "Fish&Chips", price: 15},
    {/*4*/name: "Fried Chicken", price: 10},
    {/*5*/name: "Cannelloni", price: 10},
    {/*6*/name: "Crepes", price: 11},
    {/*7*/name: "Gyros", price: 10}
];
let meals3 = [
    {/*1*/name: "Greek Salad", price: 11},
    {/*2*/name: "Seafood", price: 15},
    {/*3*/name: "Falafel", price: 16},
    {/*4*/name: "Wraps", price: 11},
    {/*5*/name: "Souvlaki", price: 11},
    {/*6*/name: "Shawarma", price: 12},
    {/*7*/name: "Quesadilla", price: 11}
];

let all_meals = [meals, meals1, meals2, meals3];

//Shuffle function, creates two variables.
const shuffle = (array) => {
  let currentIndex = array.length,
    randomIndex;
  //The function starts from the array length and ends when reaches 0
  while (currentIndex !== 0) {
    //Assigns a random number to the variable, and each time it runs, it lowers the max number by 1.
    randomIndex = Math.floor(Math.random() * currentIndex);
    currentIndex--;
    //It swaps the current array element, with the one equivalent to the random number index.
    [array[currentIndex], array[randomIndex]] = [
      array[randomIndex],
      array[currentIndex]
    ];
  }
  return array;
}

let week = ["Week 1", "Week 2", "Week 3", "Week 4"];
const dayOfTheWeek = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"]
// meals = shuffle(meals);

//I've created a for loop to go through the new shuffled array.

for (let w = 0; w < week.length; w++) {
  console.log("\n" + week[w])
  let week_meals = shuffle(all_meals[w]);
  for (let i = 0; i < meals.length; i++) {
    //In here I'm saying that if the number of meals is equal to the week days, the weekly menu will be printed.
    if (week_meals.length === dayOfTheWeek.length) {
      menu.meal = week_meals[i].name;
      menu.price = week_meals[i].price;
      console.log(dayOfTheWeek[i] + menu.todaysSpecial);
      //If the meals are less, it will print how many need to be added.
    } else if (week_meals.length < dayOfTheWeek.length) {
      console.log(`You need to add ${Math.abs(meals.length - dayOfTheWeek.length)} meal(s) to the list!!!`)
      break;
      //If the meals are more, than it will print how many need to be removed.
    } else if (week_meals.length > dayOfTheWeek.length) {
      console.log(`You need to remove ${Math.abs(week_meals.length - dayOfTheWeek.length)} meal(s) from the list!!!`)
      break;
    }
  }
}

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.